private DeclarationIL Build(IDeclaration declaration, ISymbolTree symbolTree) { if (declarationsIL.TryGetValue(declaration.Symbol, out var declarationIL)) { return(declarationIL); } switch (declaration) { default: throw ExhaustiveMatch.Failed(declaration); case IFunctionDeclaration function: { var il = ilFactory.CreateGraph(function); declarationIL = new FunctionIL(false, false, function.Symbol, BuildParameters(function.Parameters), il); break; } case IAssociatedFunctionDeclaration associatedFunction: { var il = ilFactory.CreateGraph(associatedFunction); declarationIL = new FunctionIL(false, true, associatedFunction.Symbol, BuildParameters(associatedFunction.Parameters), il); break; } case IConcreteMethodDeclaration method: { var il = ilFactory.CreateGraph(method); declarationIL = new MethodDeclarationIL(method.Symbol, BuildParameter(method.SelfParameter), BuildParameters(method.Parameters), il); break; } case IAbstractMethodDeclaration method: { declarationIL = new MethodDeclarationIL(method.Symbol, BuildParameter(method.SelfParameter), BuildParameters(method.Parameters), null); break; } case IConstructorDeclaration constructor: { var il = ilFactory.CreateGraph(constructor); var parameters = BuildConstructorParameters(constructor); var fieldInitializations = BuildFieldInitializations(constructor); declarationIL = new ConstructorIL(constructor.Symbol, parameters, fieldInitializations, il); break; } case IFieldDeclaration fieldDeclaration: declarationIL = new FieldIL(fieldDeclaration.Symbol); break; case IClassDeclaration classDeclaration: declarationIL = new ClassIL(classDeclaration.Symbol, BuildClassMembers(classDeclaration, symbolTree)); break; } declarationsIL.Add(declaration.Symbol, declarationIL); return(declarationIL); }
private void EmitMethod(MethodDeclarationIL method, Code code) { if (method.IL is null) { return; } var name = nameMangler.MangleName(method); var parameters = Convert(method.Parameters.Prepend(method.SelfParameter)); var returnType = typeConverter.Convert(method.Symbol.ReturnDataType.Known()); // Write out the function declaration for C so we can call functions defined after others code.FunctionDeclarations.AppendLine($"{returnType} {name}({parameters});"); code.Definitions.DeclarationSeparatorLine(); code.Definitions.AppendLine($"{returnType} {name}({parameters})"); code.Definitions.BeginBlock(); controlFlowEmitter.Emit(method, code); code.Definitions.EndBlock(); }
public string MangleMethodName(MethodDeclarationIL method) { return(MangleMethod(method.Symbol)); }