N°2957 - Compile classes in separated files

This commit is contained in:
Eric
2020-07-10 14:41:08 +02:00
parent ea75092bb3
commit 78516f437a

View File

@@ -318,14 +318,21 @@ class MFCompiler
}
else
{
/** @var \DOMElement $oClass */
/** @var \MFElement $oClass */
foreach($oClasses as $oClass)
{
$sClass = $oClass->getAttribute("id");
$aAllClasses[] = $sClass;
try
{
$sCompiledCode .= $this->CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir);
$aCompiledClasses = $this->CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir);
foreach ($aCompiledClasses as $sClass => $sCompiledClass)
{
$sClassFileName = DIRECTORY_SEPARATOR.$sRelativeDir.DIRECTORY_SEPARATOR.'model'.DIRECTORY_SEPARATOR.$sClass.'.php';
$sClassFile = "{$sTempTargetDir}{$sClassFileName}";
$this->WritePHPFile($sClassFile, $sModuleName, $sModuleVersion, $sCompiledClass);
$sCompiledCode .= "require_once ('{$sFinalTargetDir}{$sClassFileName}');\n";
}
}
catch (DOMFormatException $e)
{
@@ -466,49 +473,7 @@ EOF;
// Write the code into the given module as model.<module>.php
//
$sResultFile = $sTempTargetDir.'/'.$sRelativeDir.'/model.'.$sModuleName.'.php';
if (is_file($sResultFile))
{
$this->Log("Updating $sResultFile for module $sModuleName in version $sModuleVersion ($iClassCount classes)");
} else
{
$sResultDir = dirname($sResultFile);
if (!is_dir($sResultDir))
{
$this->Log("Creating directory $sResultDir");
mkdir($sResultDir, 0777, true);
}
$this->Log("Creating $sResultFile for module $sModuleName in version $sModuleVersion ($iClassCount classes)");
}
// Compile the module into a single file
//
$sCurrDate = date(DATE_ISO8601);
$sAuthor = 'iTop compiler';
$sLicence = 'http://opensource.org/licenses/AGPL-3.0';
$sFileHeader =
<<<EOF
<?php
//
// File generated by ... on the $sCurrDate
// Please do not edit manually
//
/**
* Classes and menus for $sModuleName (version $sModuleVersion)
*
* @author $sAuthor
* @license $sLicence
*/
EOF;
$ret = file_put_contents($sResultFile, $sFileHeader.$sCompiledCode);
if ($ret === false)
{
$iLen = strlen($sFileHeader.$sCompiledCode);
$fFree = @disk_free_space(dirname($sResultFile));
$aErr = error_get_last();
throw new Exception("Failed to write '$sResultFile'. Last error: '{$aErr['message']}', content to write: $iLen bytes, available free space on disk: $fFree.");
}
$this->WritePHPFile($sResultFile, $sModuleName, $sModuleVersion, $sCompiledCode);
}
else
{
@@ -611,8 +576,8 @@ EOF;
SetupUtils::builddir($sTempTargetDir.'/core');
$sPHPFile = $sTempTargetDir.'/core/main.php';
file_put_contents($sPHPFile, $this->sMainPHPCode);
$sCurrDate = date(DATE_ISO8601);
// Autoload
$sPHPFile = $sTempTargetDir.'/autoload.php';
$sPHPFileContent =
@@ -1018,7 +983,7 @@ EOF
* @param string $sFinalTargetDir
* @param string $sModuleRelativeDir
*
* @return string
* @return array
* @throws \DOMFormatException
*/
protected function CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir)
@@ -2030,7 +1995,7 @@ $sZlists;
EOF;
// some other stuff (magical attributes like friendlyName) are done in MetaModel::InitClasses and though not present in the
// generated PHP
$sPHP = $this->GeneratePhpCodeForClass($sClassName, $sParentClass, $sClassParams, $sInitMethodCalls,
$aPHP[$sClassName] = $this->GeneratePhpCodeForClass($sClassName, $sParentClass, $sClassParams, $sInitMethodCalls,
$bIsAbstractClass, $sMethods, $aRequiredFiles, $sCodeComment);
// N°931 generates TagFieldData classes for AttributeTag fields
@@ -2060,11 +2025,11 @@ EOF
{
$sTagClassName = static::GetTagDataClassName($sClassName, $sTagFieldName);
$sTagClassParams = var_export($aTagClassParams, true);
$sPHP .= $this->GeneratePhpCodeForClass($sTagClassName, $sTagClassParentClass, $sTagClassParams, $sTagInitMethodCalls);
$aPHP[$sTagClassName] = $this->GeneratePhpCodeForClass($sTagClassName, $sTagClassParentClass, $sTagClassParams, $sTagInitMethodCalls);
}
}
return $sPHP;
return $aPHP;
}
private static function GetTagDataClassName($sClass, $sAttCode)
@@ -3150,4 +3115,53 @@ XML;
$this->WriteFile("$sTempTargetDir/web.config", $sContent);
}
/**
* @param $sResultFile
* @param $sModuleName
* @param $sModuleVersion
* @param $sCompiledCode
*
* @throws \Exception
*/
protected function WritePHPFile($sResultFile, $sModuleName, $sModuleVersion, $sCompiledCode)
{
if (is_file($sResultFile))
{
$this->Log("Updating $sResultFile for module $sModuleName in version $sModuleVersion");
}
else
{
$sResultDir = dirname($sResultFile);
if (!is_dir($sResultDir))
{
$this->Log("Creating directory $sResultDir");
mkdir($sResultDir, 0777, true);
}
$this->Log("Creating $sResultFile for module $sModuleName in version $sModuleVersion");
}
// Compile the module into a single file
//
$sCurrDate = date(DATE_ISO8601);
$sAuthor = 'iTop compiler';
$sLicence = 'http://opensource.org/licenses/AGPL-3.0';
$sFileHeader =
<<<EOF
<?php
//
// File generated by ... on the $sCurrDate
// Please do not edit manually
//
/**
* Classes and menus for $sModuleName (version $sModuleVersion)
*
* @author $sAuthor
* @license $sLicence
*/
EOF;
$this->WriteFile($sResultFile, $sFileHeader.$sCompiledCode);
}
}