private Declaration CreateDeclaration(
            string identifierName,
            string asTypeName,
            Accessibility accessibility,
            DeclarationType declarationType,
            ParserRuleContext context,
            Selection selection,
            bool isArray,
            VBAParser.AsTypeClauseContext asTypeContext,
            string typeHint,
            bool selfAssigned = false,
            bool withEvents   = false)
        {
            Declaration result;

            if (declarationType == DeclarationType.Parameter)
            {
                var argContext = (VBAParser.ArgContext)context;
                var isOptional = argContext.OPTIONAL() != null;

                var isByRef      = argContext.BYREF() != null;
                var isParamArray = argContext.PARAMARRAY() != null;
                result = new ParameterDeclaration(
                    new QualifiedMemberName(_qualifiedName, identifierName),
                    _parentDeclaration,
                    context,
                    selection,
                    asTypeName,
                    asTypeContext,
                    typeHint,
                    isOptional,
                    isByRef,
                    isArray,
                    isParamArray);
                if (_parentDeclaration is IDeclarationWithParameter)
                {
                    ((IDeclarationWithParameter)_parentDeclaration).AddParameter(result);
                }
            }
            else
            {
                var        key        = Tuple.Create(identifierName, declarationType);
                Attributes attributes = null;
                if (_attributes.ContainsKey(key))
                {
                    attributes = _attributes[key];
                }

                var annotations = FindAnnotations(selection.StartLine);
                if (declarationType == DeclarationType.Procedure)
                {
                    result = new SubroutineDeclaration(new QualifiedMemberName(_qualifiedName, identifierName), _parentDeclaration, _currentScopeDeclaration, asTypeName, accessibility, context, selection, false, annotations, attributes);
                }
                else if (declarationType == DeclarationType.Function)
                {
                    result = new FunctionDeclaration(
                        new QualifiedMemberName(_qualifiedName, identifierName),
                        _parentDeclaration,
                        _currentScopeDeclaration,
                        asTypeName,
                        asTypeContext,
                        typeHint,
                        accessibility,
                        context,
                        selection,
                        isArray,
                        false,
                        annotations,
                        attributes);
                }
                else if (declarationType == DeclarationType.LibraryProcedure || declarationType == DeclarationType.LibraryFunction)
                {
                    result = new ExternalProcedureDeclaration(new QualifiedMemberName(_qualifiedName, identifierName), _parentDeclaration, _currentScopeDeclaration, declarationType, asTypeName, asTypeContext, accessibility, context, selection, false, annotations);
                }
                else if (declarationType == DeclarationType.PropertyGet)
                {
                    result = new PropertyGetDeclaration(
                        new QualifiedMemberName(_qualifiedName, identifierName),
                        _parentDeclaration,
                        _currentScopeDeclaration,
                        asTypeName,
                        asTypeContext,
                        typeHint,
                        accessibility,
                        context,
                        selection,
                        isArray,
                        false,
                        annotations,
                        attributes);
                }
                else if (declarationType == DeclarationType.PropertySet)
                {
                    result = new PropertySetDeclaration(new QualifiedMemberName(_qualifiedName, identifierName), _parentDeclaration, _currentScopeDeclaration, asTypeName, accessibility, context, selection, false, annotations, attributes);
                }
                else if (declarationType == DeclarationType.PropertyLet)
                {
                    result = new PropertyLetDeclaration(new QualifiedMemberName(_qualifiedName, identifierName), _parentDeclaration, _currentScopeDeclaration, asTypeName, accessibility, context, selection, false, annotations, attributes);
                }
                else
                {
                    result = new Declaration(
                        new QualifiedMemberName(_qualifiedName, identifierName),
                        _parentDeclaration,
                        _currentScopeDeclaration,
                        asTypeName,
                        typeHint,
                        selfAssigned,
                        withEvents,
                        accessibility,
                        declarationType,
                        context,
                        selection,
                        isArray,
                        asTypeContext,
                        false,
                        annotations,
                        attributes);
                }
                if (_parentDeclaration.DeclarationType == DeclarationType.ClassModule && result is ICanBeDefaultMember && ((ICanBeDefaultMember)result).IsDefaultMember)
                {
                    ((ClassModuleDeclaration)_parentDeclaration).DefaultMember = result;
                }
            }
            return(result);
        }
Exemple #2
0
        private static List <Declaration> AddSpecialFormDeclarations(Declaration parentProject, Declaration parentModule)
        {
            List <Declaration> declarations = new List <Declaration>();

            Debug.Assert(parentModule != null);
            var arrayFunction = new FunctionDeclaration(
                new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Array"),
                parentModule,
                parentModule,
                "Variant",
                null,
                null,
                Accessibility.Public,
                null,
                Selection.Home,
                false,
                true,
                null,
                new Attributes());
            var inputFunction   = new SubroutineDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Input"), parentModule, parentModule, "Variant", Accessibility.Public, null, Selection.Home, true, null, new Attributes());
            var numberParam     = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Number"), inputFunction, "Integer", null, null, false, false);
            var filenumberParam = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Filenumber"), inputFunction, "Integer", null, null, false, false);

            inputFunction.AddParameter(numberParam);
            inputFunction.AddParameter(filenumberParam);
            var inputBFunction   = new SubroutineDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "InputB"), parentModule, parentModule, "Variant", Accessibility.Public, null, Selection.Home, true, null, new Attributes());
            var numberBParam     = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Number"), inputBFunction, "Integer", null, null, false, false);
            var filenumberBParam = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Filenumber"), inputBFunction, "Integer", null, null, false, false);

            inputBFunction.AddParameter(numberBParam);
            inputBFunction.AddParameter(filenumberBParam);
            var lboundFunction = new FunctionDeclaration(
                new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "LBound"),
                parentModule,
                parentModule,
                "Long",
                null,
                null,
                Accessibility.Public,
                null,
                Selection.Home,
                false,
                true,
                null,
                new Attributes());
            var arrayNameParam = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Arrayname"), lboundFunction, "Integer", null, null, false, false);
            var dimensionParam = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Dimension"), lboundFunction, "Integer", null, null, true, false);

            lboundFunction.AddParameter(arrayNameParam);
            lboundFunction.AddParameter(dimensionParam);
            var uboundFunction = new FunctionDeclaration(
                new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "UBound"),
                parentModule,
                parentModule,
                "Integer",
                null,
                null,
                Accessibility.Public,
                null,
                Selection.Home,
                false,
                true,
                null,
                new Attributes());
            var arrayParam = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Array"), uboundFunction, "Variant", null, null, false, false, true);
            var rankParam  = new ParameterDeclaration(new QualifiedMemberName(parentModule.QualifiedName.QualifiedModuleName, "Rank"), uboundFunction, "Integer", null, null, true, false);

            uboundFunction.AddParameter(arrayParam);
            uboundFunction.AddParameter(rankParam);
            declarations.Add(arrayFunction);
            declarations.Add(inputFunction);
            declarations.Add(inputBFunction);
            declarations.Add(lboundFunction);
            declarations.Add(uboundFunction);
            return(declarations);
        }
        private IReadOnlyList <Declaration> AddAliasDeclarations()
        {
            var conversionModule = _state.AllDeclarations.SingleOrDefault(
                item => item.IdentifierName == "Conversion" && item.Scope == "VBE7.DLL;VBA.Conversion");

            var fileSystemModule = _state.AllDeclarations.SingleOrDefault(
                item => item.IdentifierName == "FileSystem" && item.Scope == "VBE7.DLL;VBA.FileSystem");

            var interactionModule = _state.AllDeclarations.SingleOrDefault(
                item => item.IdentifierName == "Interaction" && item.Scope == "VBE7.DLL;VBA.Interaction");

            var stringsModule = _state.AllDeclarations.SingleOrDefault(
                item => item.IdentifierName == "Strings" && item.Scope == "VBE7.DLL;VBA.Strings");

            // all these modules are all part of the same project--only need to check one
            if (conversionModule == null)
            {
                return(new List <Declaration>());
            }

            var functions = _state.AllDeclarations.Where(s => s.DeclarationType == DeclarationType.Function &&
                                                         s.Scope.StartsWith("VBE") &&
                                                         Tokens.Any(token => s.IdentifierName == "_B_var_" + token))
                            .ToList();

            var errorFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Conversion"), "Error"),
                conversionModule,
                conversionModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var hexFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Conversion"), "Hex"),
                conversionModule,
                conversionModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var octFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Conversion"), "Oct"),
                conversionModule,
                conversionModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var strFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Conversion"), "Str"),
                conversionModule,
                conversionModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var curDirFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "FileSystem"), "CurDir"),
                fileSystemModule,
                fileSystemModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var commandFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Interaction"), "Command"),
                interactionModule,
                interactionModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var environFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Interaction"), "Environ"),
                interactionModule,
                interactionModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var chrFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "Chr"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var chrwFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "ChrW"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var formatFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "Format"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var lcaseFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "LCase"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var leftFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "Left"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var leftbFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "LeftB"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var ltrimFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "LTrim"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var midFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "Mid"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var midbFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "MidB"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var trimFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "Trim"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var rightFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "Right"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var rightbFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "RightB"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var rtrimFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "RTrim"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var ucaseFunction = new FunctionDeclaration(
                new QualifiedMemberName(
                    new QualifiedModuleName("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", "Strings"), "UCase"),
                stringsModule,
                stringsModule,
                "Variant",
                null,
                string.Empty,
                Accessibility.Global,
                null,
                new Selection(),
                false,
                true,
                new List <IAnnotation>(),
                new Attributes());

            var functionAliases = new List <Declaration> {
                errorFunction,
                hexFunction,
                octFunction,
                strFunction,
                curDirFunction,
                commandFunction,
                environFunction,
                chrFunction,
                chrwFunction,
                formatFunction,
                lcaseFunction,
                leftFunction,
                leftbFunction,
                ltrimFunction,
                midFunction,
                midbFunction,
                trimFunction,
                rightFunction,
                rightbFunction,
                rtrimFunction,
                ucaseFunction
            };

            // ReSharper disable once PossibleInvalidCastExceptionInForeachLoop
            foreach (FunctionDeclaration alias in functionAliases)
            {
                foreach (var parameter in ((FunctionDeclaration)functions.Single(s => s.IdentifierName == "_B_var_" + alias.IdentifierName)).Parameters)
                {
                    alias.AddParameter(parameter);
                }
            }

            return(functionAliases);
        }