public static CodeGenerationResult GenerateProjectCode(GenerationOptions options, ProjectBackend[] projects)
{
ArrayList warningList = new ArrayList ();
List<SteticCompilationUnit> units = new List<SteticCompilationUnit> ();
SteticCompilationUnit globalUnit = new SteticCompilationUnit ("");
units.Add (globalUnit);
if (options == null)
options = new GenerationOptions ();
CodeNamespace globalNs = new CodeNamespace (options.GlobalNamespace);
globalUnit.Namespaces.Add (globalNs);
// Global class
CodeTypeDeclaration globalType = new CodeTypeDeclaration ("Gui");
globalType.Attributes = MemberAttributes.Private;
globalType.TypeAttributes = TypeAttributes.NestedAssembly;
globalNs.Types.Add (globalType);
// Create the project initialization method
// This method will only be added at the end if there
// is actually something to initialize
CodeMemberMethod initMethod = new CodeMemberMethod ();
initMethod.Name = "Initialize";
initMethod.ReturnType = new CodeTypeReference (typeof(void));
initMethod.Attributes = MemberAttributes.Assembly | MemberAttributes.Static;
initMethod.Parameters.Add (new CodeParameterDeclarationExpression (typeof(Gtk.Widget), "iconRenderer"));
GeneratorContext initContext = new ProjectGeneratorContext (globalNs, globalType, initMethod.Statements, options);
initContext.RootObject = new CodeArgumentReferenceExpression ("iconRenderer");
// Generate icon factory creation
foreach (ProjectBackend gp in projects) {
if (gp.IconFactory.Icons.Count > 0)
gp.IconFactory.GenerateBuildCode (initContext);
}
warningList.AddRange (initContext.Warnings);
// Generate the code
if (options.UsePartialClasses)
CodeGeneratorPartialClass.GenerateProjectGuiCode (globalUnit, globalNs, globalType, options, units, projects, warningList);
else
CodeGeneratorInternalClass.GenerateProjectGuiCode (globalUnit, globalNs, globalType, options, units, projects, warningList);
GenerateProjectActionsCode (globalNs, options, projects);
// Final step. If there is some initialization code, add all needed infrastructure
globalType.Members.Add (initMethod);
CodeMemberField initField = new CodeMemberField (typeof(bool), "initialized");
initField.Attributes = MemberAttributes.Private | MemberAttributes.Static;
globalType.Members.Add (initField);
CodeFieldReferenceExpression initVar = new CodeFieldReferenceExpression (
new CodeTypeReferenceExpression (globalNs.Name + ".Gui"),
"initialized"
);
CodeConditionStatement initCondition = new CodeConditionStatement ();
initCondition.Condition = new CodeBinaryOperatorExpression (
initVar,
CodeBinaryOperatorType.IdentityEquality,
new CodePrimitiveExpression (false)
);
initCondition.TrueStatements.Add (new CodeAssignStatement (
initVar,
new CodePrimitiveExpression (true)
));
initCondition.TrueStatements.AddRange (initMethod.Statements);
initMethod.Statements.Clear ();
initMethod.Statements.Add (initCondition);
return new CodeGenerationResult (units.ToArray (), (string[]) warningList.ToArray (typeof(string)));
}