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}");
        }
Beispiel #2
0
        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}");
        }