public override void EnterFunctionDecl(GoParser.FunctionDeclContext context) { m_inFunction = true; // May need to scope certain objects, like consts, to current function m_originalFunctionName = context.IDENTIFIER().GetText(); m_currentFunctionName = SanitizedIdentifier(m_originalFunctionName); string scope = char.IsUpper(m_originalFunctionName[0]) ? "public" : "private"; // Handle Go "main" function as a special case, in C# this should be capitalized "Main" if (m_currentFunctionName.Equals("main")) { m_currentFunctionName = "Main"; // Track file names that contain main function in main package if (Package.Equals("main")) { s_mainPackageFiles.Add(TargetFileName); } } // Function signature containing result type and parameters have not been visited yet, // so we mark their desired positions and replace once the visit has occurred m_functionResultTypeMarker = string.Format(FunctionResultTypeMarker, m_currentFunctionName); m_functionParametersMarker = string.Format(FunctionParametersMarker, m_currentFunctionName); m_functionExecContextMarker = string.Format(FunctionExecContextMarker, m_currentFunctionName); PushInnerBlockPrefix(string.Format(FunctionBlockPrefixMarker, m_currentFunctionName)); m_targetFile.AppendLine($"{Spacing()}{scope} static {m_functionResultTypeMarker} {m_currentFunctionName}{m_functionParametersMarker}{m_functionExecContextMarker}"); }
public override void EnterFunctionDecl(GoParser.FunctionDeclContext context) { InFunction = true; OriginalFunctionName = context.IDENTIFIER()?.GetText() ?? "_"; CurrentFunctionName = SanitizedIdentifier(OriginalFunctionName); string functionSignature = FunctionSignature.Generate(OriginalFunctionName); FunctionInfo currentFunction = null; Metadata?.Functions.TryGetValue(functionSignature, out currentFunction); CurrentFunction = currentFunction; }
public override void EnterFunctionDecl(GoParser.FunctionDeclContext context) { m_inFunction = true; // May need to scope certain objects, like consts, to current function m_originalFunctionName = context.IDENTIFIER().GetText(); m_currentFunctionName = SanitizedIdentifier(m_originalFunctionName); m_variableIdentifiers.Clear(); m_variableTypes.Clear(); string functionSignature = FunctionSignature.Generate(m_originalFunctionName); if (!Metadata.Functions.TryGetValue(functionSignature, out m_currentFunction)) { throw new InvalidOperationException($"Failed to find metadata for method function \"{functionSignature}\"."); } FunctionSignature function = m_currentFunction.Signature; if (function is null) { throw new InvalidOperationException($"Failed to find signature metadata for function \"{m_currentFunctionName}\"."); } string scope = char.IsUpper(m_originalFunctionName[0]) ? "public" : "private"; // Handle Go "main" function as a special case, in C# this should be capitalized "Main" if (m_currentFunctionName.Equals("main")) { m_currentFunctionName = "Main"; // Track file names that contain main function in main package if (Package.Equals("main")) { s_mainPackageFiles.Add(TargetFileName); } } // Function signature containing result type and parameters have not been visited yet, // so we mark their desired positions and replace once the visit has occurred m_functionResultTypeMarker = string.Format(FunctionResultTypeMarker, m_currentFunctionName); m_functionParametersMarker = string.Format(FunctionParametersMarker, m_currentFunctionName); m_functionExecContextMarker = string.Format(FunctionExecContextMarker, m_currentFunctionName); PushInnerBlockPrefix(string.Format(FunctionBlockPrefixMarker, m_currentFunctionName)); m_targetFile.AppendLine($"{Spacing()}{scope} static {m_functionResultTypeMarker} {m_currentFunctionName}{m_functionParametersMarker}{m_functionExecContextMarker}"); }