public override void EnterFunctionDeclarationHeader(CodeElementsParser.FunctionDeclarationHeaderContext context)
        {
            var type = FunctionType.Undefined;

            if (context.PROCEDURE() != null)
            {
                type = FunctionType.Procedure;
            }
            if (context.FUNCTION() != null)
            {
                type = FunctionType.Function;
            }

            //TCRFUN_DEFAULT_ACCESS_MODIFIER  rule is respected here.
            //By default a function or procedure is private even if PRIVATE keyword is not given.
            //If PUBLIC keyword is set, the function/procedure as to be set PUBLIC.
            var visibility = context.PUBLIC() != null ? AccessModifier.Public : AccessModifier.Private;

            SymbolDefinition name = null;

            if (context.functionNameDefinition() != null)
            {
                name = CobolWordsBuilder.CreateFunctionNameDefinition(context.functionNameDefinition());
            }
            Context     = context;
            CodeElement = new FunctionDeclarationHeader(name, visibility, type);
        }
Exemple #2
0
        public override void EnterFunctionDeclarationHeader(CodeElementsParser.FunctionDeclarationHeaderContext context)
        {
            var type = FunctionType.Undefined;

            if (context.PROCEDURE() != null)
            {
                type = FunctionType.Procedure;
            }
            if (context.FUNCTION() != null)
            {
                type = FunctionType.Function;
            }

            // TCRFUN_NO_DEFAULT_ACCESS_MODIFIER
            // As the grammar enforces that there must be one least one of the PUBLIC or PRIVATE keywords,
            // there will be a syntax error if there is neither of these two keywords.
            // So, the fact of considering a function PRIVATE by default does not break this rule.
            var visibility = context.PUBLIC() != null ? AccessModifier.Public : AccessModifier.Private;

            SymbolDefinition name = null;

            if (context.functionNameDefinition() != null)
            {
                name = CobolWordsBuilder.CreateFunctionNameDefinition(context.functionNameDefinition());
            }
            Context     = context;
            CodeElement = new FunctionDeclarationHeader(name, visibility, type);
        }
Exemple #3
0
 public static void OnCodeElement(FunctionDeclarationHeader function,
                                  CodeElementsParser.FunctionDeclarationHeaderContext context)
 {
     if (function.ActualType == FunctionType.Undefined)
     {
         DiagnosticUtils.AddError(function,
                                  "Incompatible parameter clauses for " + ToString(function.UserDefinedType) + " \"" + function.Name +
                                  "\"", context);
     }
     else if ((function.ActualType == FunctionType.Function &&
               function.UserDefinedType == FunctionType.Procedure) ||
              (function.ActualType == FunctionType.Procedure &&
               function.UserDefinedType == FunctionType.Function))
     {
         var message = "Symbol \"" + function.Name + "\" is defined as " + ToString(function.UserDefinedType)
                       + ", but parameter clauses describe a " + ToString(function.ActualType);
         DiagnosticUtils.AddError(function, message, context);
     }
 }
        public override void ExitFunctionDeclarationHeader(CodeElementsParser.FunctionDeclarationHeaderContext context)
        {
            // Register call parameters (shared storage areas) information at the CodeElement level
            var function = (FunctionDeclarationHeader)CodeElement;
            var target   = new CallTarget()
            {
                Name = function.FunctionName
            };
            int parametersCount = function.Profile.InputParameters.Count
                                  + function.Profile.InoutParameters.Count
                                  + function.Profile.OutputParameters.Count
                                  + (function.Profile.ReturningParameter != null ? 1 : 0);

            target.Parameters = new CallTargetParameter[parametersCount];
            int i = 0;

            foreach (var param in function.Profile.InputParameters)
            {
                target.Parameters[i++] = CreateCallTargetParameter(param);
            }
            foreach (var param in function.Profile.OutputParameters)
            {
                target.Parameters[i++] = CreateCallTargetParameter(param);
            }
            foreach (var param in function.Profile.InoutParameters)
            {
                target.Parameters[i++] = CreateCallTargetParameter(param);
            }
            if (function.Profile.ReturningParameter != null)
            {
                target.Parameters[i++] = CreateCallTargetParameter(function.Profile.ReturningParameter);
            }
            function.CallTarget = target;

            Context     = context;
            CodeElement = function;
            FunctionDeclarationTypeChecker.OnCodeElement(function, context);
        }