public DeclarationSymbolsListener(
            RubberduckParserState state,
            QualifiedModuleName qualifiedModuleName,
            IEnumerable <IAnnotation> annotations,
            IDictionary <Tuple <string, DeclarationType>,
                         Attributes> attributes,
            Declaration projectDeclaration)
        {
            _state = state;
            _qualifiedModuleName = qualifiedModuleName;
            _annotations         = annotations;
            _attributes          = attributes;

            var componentType   = _qualifiedModuleName.ComponentType;
            var declarationType = componentType == ComponentType.StandardModule
                ? DeclarationType.ProceduralModule
                : DeclarationType.ClassModule;

            var key = Tuple.Create(_qualifiedModuleName.ComponentName, declarationType);
            var moduleAttributes = attributes.ContainsKey(key)
                ? attributes[key]
                : new Attributes();

            if (declarationType == DeclarationType.ProceduralModule)
            {
                _moduleDeclaration = new ProceduralModuleDeclaration(
                    _qualifiedModuleName.QualifyMemberName(_qualifiedModuleName.ComponentName),
                    projectDeclaration,
                    _qualifiedModuleName.ComponentName,
                    true,
                    FindAnnotations(),
                    moduleAttributes);
            }
            else
            {
                bool hasDefaultInstanceVariable = componentType != ComponentType.ClassModule && componentType != ComponentType.StandardModule;

                _moduleDeclaration = new ClassModuleDeclaration(
                    _qualifiedModuleName.QualifyMemberName(_qualifiedModuleName.ComponentName),
                    projectDeclaration,
                    _qualifiedModuleName.ComponentName,
                    true,
                    FindAnnotations(),
                    moduleAttributes,
                    hasDefaultInstanceVariable: hasDefaultInstanceVariable);
            }

            SetCurrentScope();
            AddDeclaration(_moduleDeclaration);

            var component = _qualifiedModuleName.Component;

            if (component != null && (componentType == ComponentType.UserForm || component.HasDesigner))
            {
                DeclareControlsAsMembers(component);
            }
        }
        public DeclarationSymbolsListener(
            QualifiedModuleName qualifiedName,
            vbext_ComponentType type,
            IEnumerable <CommentNode> comments,
            IEnumerable <IAnnotation> annotations,
            IDictionary <Tuple <string, DeclarationType>, Attributes> attributes,
            HashSet <ReferencePriorityMap> projectReferences,
            Declaration projectDeclaration)
        {
            _qualifiedName = qualifiedName;
            _comments      = comments;
            _annotations   = annotations;
            _attributes    = attributes;

            var declarationType = type == vbext_ComponentType.vbext_ct_StdModule
                ? DeclarationType.ProceduralModule
                : DeclarationType.ClassModule;

            _projectReferences  = projectReferences;
            _projectDeclaration = projectDeclaration;

            var key = Tuple.Create(_qualifiedName.ComponentName, declarationType);
            var moduleAttributes = attributes.ContainsKey(key)
                ? attributes[key]
                : new Attributes();

            if (declarationType == DeclarationType.ProceduralModule)
            {
                _moduleDeclaration = new ProceduralModuleDeclaration(
                    _qualifiedName.QualifyMemberName(_qualifiedName.Component.Name),
                    _projectDeclaration,
                    _qualifiedName.Component.Name,
                    false,
                    FindAnnotations(),
                    moduleAttributes);
            }
            else
            {
                bool hasDefaultInstanceVariable = type != vbext_ComponentType.vbext_ct_ClassModule && type != vbext_ComponentType.vbext_ct_StdModule;
                _moduleDeclaration = new ClassModuleDeclaration(
                    _qualifiedName.QualifyMemberName(_qualifiedName.Component.Name),
                    _projectDeclaration,
                    _qualifiedName.Component.Name,
                    false,
                    FindAnnotations(),
                    moduleAttributes,
                    hasDefaultInstanceVariable: hasDefaultInstanceVariable);
            }
            SetCurrentScope();
            AddDeclaration(_moduleDeclaration);
            var component = _moduleDeclaration.QualifiedName.QualifiedModuleName.Component;

            if (component.Type == vbext_ComponentType.vbext_ct_MSForm || component.Designer != null)
            {
                DeclareControlsAsMembers(component);
            }
        }
Beispiel #3
0
        public DeclarationSymbolsListener(
            QualifiedModuleName qualifiedName,
            Accessibility componentAccessibility,
            vbext_ComponentType type,
            IEnumerable <CommentNode> comments,
            IEnumerable <IAnnotation> annotations,
            IDictionary <Tuple <string, DeclarationType>, Attributes> attributes,
            HashSet <ReferencePriorityMap> projectReferences,
            Declaration projectDeclaration)
        {
            _qualifiedName = qualifiedName;
            _comments      = comments;
            _annotations   = annotations;
            _attributes    = attributes;

            var declarationType = type == vbext_ComponentType.vbext_ct_StdModule
                ? DeclarationType.ProceduralModule
                : DeclarationType.ClassModule;

            _projectReferences  = projectReferences;
            _projectDeclaration = projectDeclaration;

            var key = Tuple.Create(_qualifiedName.ComponentName, declarationType);
            var moduleAttributes = attributes.ContainsKey(key)
                ? attributes[key]
                : new Attributes();

            if (declarationType == DeclarationType.ProceduralModule)
            {
                _moduleDeclaration = new ProceduralModuleDeclaration(
                    _qualifiedName.QualifyMemberName(_qualifiedName.Component.Name),
                    _projectDeclaration,
                    _qualifiedName.Component.Name,
                    false,
                    FindAnnotations(),
                    moduleAttributes);
            }
            else
            {
                _moduleDeclaration = new ClassModuleDeclaration(
                    _qualifiedName.QualifyMemberName(_qualifiedName.Component.Name),
                    _projectDeclaration,
                    _qualifiedName.Component.Name,
                    false,
                    FindAnnotations(),
                    moduleAttributes);
            }

            SetCurrentScope();
        }
Beispiel #4
0
        public static bool TryParse(string[] body, QualifiedModuleName qualifiedModuleName, out Member result)
        {
            var signature = body.FirstOrDefault(line => Keywords.Any(line.Trim().StartsWith));

            if (signature == null)
            {
                result = null;
                return(false);
            }

            signature = signature.Trim().Replace("\r", string.Empty);
            body      = body.Select(line => line.Trim().Replace("\r", string.Empty)).ToArray();

            var withoutKeyword = signature.Substring((Keywords.First(keyword => signature.StartsWith(keyword))).Length);
            var name           = withoutKeyword.Split(' ')[1]
                                 .Split('(')[0];

            var type       = GetMemberType(signature, withoutKeyword);
            var visibility = GetMemberVisibility(signature);

            var signatureLineIndex = body.ToList().IndexOf(signature);
            var attributes         = MemberAttribute.GetAttributes(body.Take(signatureLineIndex)
                                                                   .Where(line => line.Trim().StartsWith("'@")));

            result = new Member(type, qualifiedModuleName.QualifyMemberName(name), signature, body, attributes);
            return(true);
        }
 public ClassModuleDeclaration(ComCoClass coClass, Declaration parent, QualifiedModuleName module,
                               Attributes attributes)
     : base(
         module.QualifyMemberName(coClass.Name),
         parent,
         parent,
         coClass.Name,
         null,
         false,
         coClass.EventInterfaces.Any(),
         Accessibility.Public,
         DeclarationType.ClassModule,
         null,
         Selection.Home,
         false,
         null,
         false,
         new List <IAnnotation>(),
         attributes)
 {
     _supertypeNames =
         coClass.ImplementedInterfaces.Where(i => !i.IsRestricted && !IgnoredInterfaces.Contains(i.Name))
         .Select(i => i.Name)
         .ToList();
     _supertypes       = new HashSet <Declaration>();
     _subtypes         = new ConcurrentDictionary <Declaration, byte>();
     IsControl         = coClass.IsControl;
     _isExtensible     = new Lazy <bool>(() => IsExtensibleToCache());
     _isExposed        = new Lazy <bool>(() => IsExposedToCache());
     _hasPredeclaredId = new Lazy <bool>(() => HasPredeclaredIdToCache());
 }
 public ClassModuleDeclaration(ComCoClass coClass, Declaration parent, QualifiedModuleName module,
                               Attributes attributes)
     : base(
         module.QualifyMemberName(coClass.Name),
         parent,
         parent,
         coClass.Name,
         null,
         false,
         coClass.EventInterfaces.Any(),
         Accessibility.Public,
         DeclarationType.ClassModule,
         null,
         Selection.Home,
         false,
         null,
         true,
         new List <IAnnotation>(),
         attributes)
 {
     _supertypeNames =
         coClass.ImplementedInterfaces.Where(i => !i.IsRestricted && !IgnoredInterfaces.Contains(i.Name))
         .Select(i => i.Name)
         .ToList();
     _supertypes = new HashSet <Declaration>();
     _subtypes   = new HashSet <Declaration>();
     IsControl   = coClass.IsControl;
 }
        private DeclarationSymbolsListener(QualifiedModuleName qualifiedName, Accessibility componentAccessibility, DeclarationType declarationType)
        {
            _qualifiedName = qualifiedName;

            SetCurrentScope();
            _declarations.Add(new Declaration(_qualifiedName.QualifyMemberName(_qualifiedName.Component.Name), _qualifiedName.Project.Name, _qualifiedName.Component.Name, false, false, componentAccessibility, declarationType, null, Selection.Home));
        }
Beispiel #8
0
 public ProjectDeclaration(ComProject project, QualifiedModuleName module)
     : this(module.QualifyMemberName(project.Name), project.Name, false)
 {
     Guid         = project.Guid;
     MajorVersion = project.MajorVersion;
     MinorVersion = project.MinorVersion;
 }
        /// <summary>
        /// Scans form designer to create a public, self-assigned field for each control on a form.
        /// </summary>
        /// <remarks>
        /// These declarations are meant to be used to identify control event procedures.
        /// </remarks>
        private void DeclareControlsAsMembers(IVBComponent form)
        {
            if (form.Controls == null)
            {
                return;
            }

            foreach (var control in form.Controls)
            {
                var typeName = control.TypeName();
                // The as type declaration should be TextBox, CheckBox, etc. depending on the type.
                var declaration = new Declaration(
                    _qualifiedName.QualifyMemberName(control.Name),
                    _parentDeclaration,
                    _currentScopeDeclaration,
                    string.IsNullOrEmpty(typeName) ? "Control" : typeName,
                    null,
                    true,
                    true,
                    Accessibility.Public,
                    DeclarationType.Control,
                    null,
                    Selection.Home,
                    false,
                    null,
                    false);
                AddDeclaration(declaration);
            }
        }
Beispiel #10
0
 public SubroutineDeclaration(ComMember member, Declaration parent, QualifiedModuleName module,
                              Attributes attributes, bool eventHandler)
     : base(
         module.QualifyMemberName(member.Name),
         parent,
         parent,
         string.Empty,
         null,
         false,
         false,
         Accessibility.Global,
         eventHandler ? DeclarationType.Event : DeclarationType.Procedure,
         null,
         Selection.Home,
         false,
         null,
         false,
         null,
         attributes)
 {
     _parameters =
         member.Parameters.Select(decl => new ParameterDeclaration(decl, this, module))
         .Cast <Declaration>()
         .ToList();
 }
 public ProceduralModuleDeclaration(ComStruct pseudo, Declaration parent, QualifiedModuleName module)
     : this(
         module.QualifyMemberName(string.Format("_{0}", pseudo.Name)),
         parent,
         string.Format("_{0}", pseudo.Name),
         true,
         new List<IAnnotation>(),
         new Attributes()) { }
Beispiel #12
0
        private Declaration CreateProjectDeclaration(string projectId)
        {
            var project = _state.ProjectsProvider.Project(projectId);

            var qualifiedModuleName = new QualifiedModuleName(project);
            var qualifiedName       = qualifiedModuleName.QualifyMemberName(project.Name);
            var projectDeclaration  = new ProjectDeclaration(qualifiedName, qualifiedName.MemberName, true, project);

            return(projectDeclaration);
        }
Beispiel #13
0
 public ProceduralModuleDeclaration(ComStruct pseudo, Declaration parent, QualifiedModuleName module)
     : this(
         module.QualifyMemberName($"_{pseudo.Name}"),
         parent,
         $"_{pseudo.Name}",
         false,
         new List <IAnnotation>(),
         new Attributes())
 {
 }
 public ClassModuleDeclaration(ComInterface @interface, Declaration parent, QualifiedModuleName module,
                               Attributes attributes)
     : this(
         module.QualifyMemberName(@interface.Name),
         parent,
         @interface.Name,
         false,
         new List <IAnnotation>(),
         attributes)
 {
 }
Beispiel #15
0
 public ProceduralModuleDeclaration(ComModule statics, Declaration parent, QualifiedModuleName module,
                                    Attributes attributes)
     : this(
         module.QualifyMemberName(statics.Name),
         parent,
         statics.Name,
         false,
         new List <IAnnotation>(),
         attributes)
 {
     IsPrivateModule = statics.IsRestricted;
 }
        private Declaration CreateProjectDeclaration(IVBProject project)
        {
            var qualifiedModuleName = new QualifiedModuleName(project);
            var qualifiedName       = qualifiedModuleName.QualifyMemberName(project.Name);
            var projectId           = qualifiedModuleName.ProjectId;
            var projectDeclaration  = new ProjectDeclaration(qualifiedName, qualifiedName.MemberName, true, project);
            var references          = ProjectReferences(projectId);

            AddReferences(projectDeclaration, references);

            return(projectDeclaration);
        }
 public ParameterDeclaration(ComParameter parameter, Declaration parent, QualifiedModuleName module)
     : this(
         module.QualifyMemberName(parameter.Name),
         parent,
         parameter.TypeName,
         null,
         null,
         parameter.IsOptional,
         parameter.IsByRef,
         parameter.IsArray,
         parameter.IsParamArray)
 {
 }
Beispiel #18
0
        private Declaration CreateProjectDeclaration(QualifiedModuleName projectQualifiedName, VBProject project)
        {
            var qualifiedName      = projectQualifiedName.QualifyMemberName(project.Name);
            var projectId          = qualifiedName.QualifiedModuleName.ProjectId;
            var projectDeclaration = new ProjectDeclaration(qualifiedName, project.Name);
            var references         = _projectReferences.Where(projectContainingReference => projectContainingReference.ContainsKey(projectId));

            foreach (var reference in references)
            {
                int priority = reference[projectId];
                projectDeclaration.AddProjectReference(reference.ReferencedProjectId, priority);
            }
            return(projectDeclaration);
        }
 public PropertyLetDeclaration(ComField field, Declaration parent, QualifiedModuleName module, Attributes attributes)
     : this(
         module.QualifyMemberName(field.Name),
         parent,
         parent,
         field.ValueType,
         Accessibility.Global,
         null,
         null,
         Selection.Home,
         false,
         null,
         attributes)
 {
 }
Beispiel #20
0
 public Declaration(ComEnumerationMember member, Declaration parent, QualifiedModuleName module) : this(
         module.QualifyMemberName(member.Name),
         parent,
         parent,
         parent.IdentifierName,
         null,
         false,
         false,
         Accessibility.Global,
         DeclarationType.EnumerationMember,
         null,
         Selection.Home,
         false,
         null)
 {
 }
Beispiel #21
0
        /// <summary>
        /// Scans form designer to create a public, self-assigned field for each control on a form.
        /// </summary>
        /// <remarks>
        /// These declarations are meant to be used to identify control event procedures.
        /// </remarks>
        private void DeclareControlsAsMembers(VBComponent form)
        {
            var designer = form.Designer;

            if (designer == null)
            {
                return;
            }

            // using dynamic typing here, because not only MSForms could have a Controls collection (e.g. MS-Access forms are 'document' modules).
            foreach (var control in ((dynamic)designer).Controls)
            {
                var declaration = new Declaration(_qualifiedName.QualifyMemberName(control.Name), _parentDeclaration, _currentScopeDeclaration, "Control", true, true, Accessibility.Public, DeclarationType.Control, null, Selection.Home);
                OnNewDeclaration(declaration);
            }
        }
 public PropertyLetDeclaration(ComMember member, Declaration parent, QualifiedModuleName module, Attributes attributes)
     : this(
         module.QualifyMemberName(member.Name),
         parent,
         parent,
         member.AsTypeName.TypeName,
         Accessibility.Global,
         null,
         null,
         Selection.Home,
         false,
         null,
         attributes)
 {
     AddParameters(member.Parameters.Select(decl => new ParameterDeclaration(decl, this, module)));
 }
 public PropertySetDeclaration(ComMember member, Declaration parent, QualifiedModuleName module,
                               Attributes attributes) : this(
         module.QualifyMemberName(member.Name),
         parent,
         parent,
         string.Empty, //TODO:  Need to get the types for these.
         Accessibility.Global,
         null,
         Selection.Home,
         false,
         null,
         attributes)
 {
     _parameters =
         member.Parameters.Select(decl => new ParameterDeclaration(decl, this, module))
         .ToList();
 }
Beispiel #24
0
 public Declaration(ComField field, Declaration parent, QualifiedModuleName module)
     : this(
         module.QualifyMemberName(field.Name),
         parent,
         parent,
         field.ValueType,
         null,
         false,
         false,
         Accessibility.Global,
         field.Type,
         null,
         Selection.Home,
         false,
         null)
 {
 }
Beispiel #25
0
 public AliasDeclaration(ComAlias alias, Declaration parent, QualifiedModuleName module)
     : base(
         module.QualifyMemberName(alias.Name),
         parent,
         parent,
         alias.TypeName,
         null,
         false,
         false,
         Accessibility.Public,
         DeclarationType.ComAlias,
         null,
         Selection.Home,
         false,
         null,
         false)
 {
 }
        /// <summary>
        /// Scans form designer to create a public, self-assigned field for each control on a form.
        /// </summary>
        /// <remarks>
        /// These declarations are meant to be used to identify control event procedures.
        /// </remarks>
        private void DeclareControlsAsMembers(IVBComponent form)
        {
            if (form.Controls == null)
            {
                return;
            }

            var libraryQualifier = string.Empty;

            if (_qualifiedModuleName.ComponentType == ComponentType.UserForm)
            {
                var msFormsLib = _state.DeclarationFinder.FindProject("MSForms");
                //Debug.Assert(msFormsLib != null);
                if (msFormsLib != null)
                {
                    // given a UserForm component, MSForms reference is in use and cannot be removed.
                    libraryQualifier = "MSForms.";
                }
            }

            foreach (var control in form.Controls)
            {
                var typeName = $"{libraryQualifier}{control.TypeName()}";
                // The as type declaration should be TextBox, CheckBox, etc. depending on the type.
                var declaration = new Declaration(
                    _qualifiedModuleName.QualifyMemberName(control.Name),
                    _parentDeclaration,
                    _currentScopeDeclaration,
                    string.IsNullOrEmpty(typeName) ? "Control" : typeName,
                    null,
                    true,
                    true,
                    Accessibility.Public,
                    DeclarationType.Control,
                    null,
                    Selection.Home,
                    false,
                    null,
                    true);

                AddDeclaration(declaration);
            }
        }
Beispiel #27
0
        /// <summary>
        /// Scans form designer to create a public, self-assigned field for each control on a form.
        /// </summary>
        /// <remarks>
        /// These declarations are meant to be used to identify control event procedures.
        /// </remarks>
        private void DeclareControlsAsMembers(VBComponent form)
        {
            if (form.Type != vbext_ComponentType.vbext_ct_MSForm)
            {
                throw new InvalidOperationException();
            }

            var designer = form.Designer;

            if (designer == null)
            {
                return;
            }

            foreach (var control in ((dynamic)designer).Controls)
            {
                _declarations.Add(new Declaration(_qualifiedName.QualifyMemberName(control.Name), _currentScope, "Control", true, true, Accessibility.Public, DeclarationType.Control, null, Selection.Home));
            }
        }
Beispiel #28
0
 public Declaration(ComStruct structure, Declaration parent, QualifiedModuleName module)
     : this(
         module.QualifyMemberName(structure.Name),
         parent,
         parent,
         structure.Name,
         null,
         false,
         false,
         Accessibility.Global,
         DeclarationType.UserDefinedType,
         null,
         Selection.Home,
         false,
         null,
         false,
         null,
         new Attributes())
 {
 }
Beispiel #29
0
 public Declaration(ComEnumeration enumeration, Declaration parent, QualifiedModuleName module) : this(
         module.QualifyMemberName(enumeration.Name),
         parent,
         parent,
         "Long",
         //Match the VBA default type declaration.  Technically these *can* be a LongLong on 64 bit systems, but would likely crash the VBE...
         null,
         false,
         false,
         Accessibility.Global,
         DeclarationType.Enumeration,
         null,
         Selection.Home,
         false,
         null,
         false,
         null,
         new Attributes())
 {
 }
Beispiel #30
0
 public FunctionDeclaration(ComMember member, Declaration parent, QualifiedModuleName module,
                            Attributes attributes) : this(
         module.QualifyMemberName(member.Name),
         parent,
         parent,
         member.ReturnType.TypeName,
         null,
         null,
         Accessibility.Global,
         null,
         Selection.Home,
         member.ReturnType.IsArray,
         false,
         null,
         attributes)
 {
     _parameters =
         member.Parameters.Select(decl => new ParameterDeclaration(decl, this, module))
         .ToList();
 }