Skip to content

Commit 0fdf379

Browse files
authored
Merge pull request #4287 from MDoerner/AttributableContexts
Contexts allowing Attributes
2 parents 2bcde43 + 11fae2d commit 0fdf379

File tree

49 files changed

+2297
-244
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2297
-244
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/EmptyModuleInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public override bool VisitModuleDeclarations(VBAParser.ModuleDeclarationsContext
8787

8888
public override bool VisitModuleDeclarationsElement(VBAParser.ModuleDeclarationsElementContext context)
8989
{
90-
return context.variableStmt() == null
90+
return context.moduleVariableStmt() == null
9191
&& context.constStmt() == null
9292
&& context.enumerationStmt() == null
9393
&& context.udtDeclaration() == null

Rubberduck.CodeAnalysis/Inspections/Concrete/ModuleScopeDimKeywordInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void ClearContexts()
4545

4646
public override void ExitVariableStmt([NotNull] VBAParser.VariableStmtContext context)
4747
{
48-
if (context.DIM() != null && context.Parent is VBAParser.ModuleDeclarationsElementContext)
48+
if (context.DIM() != null && context.TryGetAncestor<VBAParser.ModuleDeclarationsElementContext>(out _))
4949
{
5050
_contexts.Add(new QualifiedContext<ParserRuleContext>(CurrentModuleName, context));
5151
}

Rubberduck.Parsing/ComReflection/SerializableDeclaration.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,25 +248,25 @@ public Declaration Unwrap(Declaration parent)
248248
case DeclarationType.ProceduralModule:
249249
return new ProceduralModuleDeclaration(QualifiedMemberName, parent, IdentifierName, false, annotations, attributes);
250250
case DeclarationType.Procedure:
251-
return new SubroutineDeclaration(QualifiedMemberName, parent, parent, AsTypeName, Accessibility, null, Selection.Empty, false, annotations, attributes);
251+
return new SubroutineDeclaration(QualifiedMemberName, parent, parent, AsTypeName, Accessibility, null, null, Selection.Empty, false, annotations, attributes);
252252
case DeclarationType.Function:
253-
return new FunctionDeclaration(QualifiedMemberName, parent, parent, AsTypeName, null, TypeHint, Accessibility, null, Selection.Empty, IsArray, false, annotations, attributes);
253+
return new FunctionDeclaration(QualifiedMemberName, parent, parent, AsTypeName, null, TypeHint, Accessibility, null, null, Selection.Empty, IsArray, false, annotations, attributes);
254254
case DeclarationType.Event:
255255
return new EventDeclaration(QualifiedMemberName, parent, parent, AsTypeName, null, TypeHint, Accessibility, null, Selection.Empty, IsArray, false, annotations, attributes);
256256
case DeclarationType.PropertyGet:
257-
return new PropertyGetDeclaration(QualifiedMemberName, parent, parent, AsTypeName, null, TypeHint, Accessibility, null, Selection.Empty, IsArray, false, annotations, attributes);
257+
return new PropertyGetDeclaration(QualifiedMemberName, parent, parent, AsTypeName, null, TypeHint, Accessibility, null, null, Selection.Empty, IsArray, false, annotations, attributes);
258258
case DeclarationType.PropertyLet:
259-
return new PropertyLetDeclaration(QualifiedMemberName, parent, parent, AsTypeName, Accessibility, null, Selection.Empty, false, annotations, attributes);
259+
return new PropertyLetDeclaration(QualifiedMemberName, parent, parent, AsTypeName, Accessibility, null, null, Selection.Empty, false, annotations, attributes);
260260
case DeclarationType.PropertySet:
261-
return new PropertySetDeclaration(QualifiedMemberName, parent, parent, AsTypeName, Accessibility, null, Selection.Empty, false, annotations, attributes);
261+
return new PropertySetDeclaration(QualifiedMemberName, parent, parent, AsTypeName, Accessibility, null, null, Selection.Empty, false, annotations, attributes);
262262
case DeclarationType.Parameter:
263263
return new ParameterDeclaration(QualifiedMemberName, parent, AsTypeName, null, TypeHint, IsOptionalParam, IsByRefParam, IsArray, IsParamArray, DefaultValue);
264264
case DeclarationType.EnumerationMember:
265265
return new ValuedDeclaration(QualifiedMemberName, parent, ParentScope, AsTypeName, null, TypeHint, annotations, Accessibility, DeclarationType.EnumerationMember, Expression, null, Selection.Home, false);
266266
case DeclarationType.Constant:
267267
return new ValuedDeclaration(QualifiedMemberName, parent, ParentScope, AsTypeName, null, TypeHint, annotations, Accessibility, DeclarationType.Constant, Expression, null, Selection.Home, false);
268268
default:
269-
return new Declaration(QualifiedMemberName, parent, ParentScope, AsTypeName, TypeHint, IsSelfAssigned, IsWithEvents, Accessibility, DeclarationType, null, Selection.Empty, IsArray, null, IsUserDefined, null, attributes);
269+
return new Declaration(QualifiedMemberName, parent, ParentScope, AsTypeName, TypeHint, IsSelfAssigned, IsWithEvents, Accessibility, DeclarationType, null, null, Selection.Empty, IsArray, null, IsUserDefined, null, attributes);
270270
}
271271
}
272272
}

Rubberduck.Parsing/Grammar/VBAParser.g4

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,19 @@ moduleDeclarationsElement :
9797
| eventStmt
9898
| constStmt
9999
| implementsStmt
100-
| variableStmt
100+
| moduleVariableStmt
101101
| moduleOption
102102
| udtDeclaration)
103103
;
104104

105+
moduleVariableStmt :
106+
variableStmt
107+
(endOfLine attributeStmt)*
108+
;
109+
105110
moduleBody :
106111
whiteSpace?
107-
(moduleBodyElement endOfStatement)*;
112+
((moduleBodyElement | attributeStmt) endOfStatement)*;
108113

109114
moduleBodyElement :
110115
functionStmt

Rubberduck.Parsing/ParserRuleContextExtensions.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,15 @@ public static TContext GetAncestor<TContext>(this ParserRuleContext context)
131131
return GetAncestor_Recursive<TContext>(context);
132132
}
133133

134+
/// <summary>
135+
/// Tries to return the context's first ancestor of the generic Type.
136+
/// </summary>
137+
public static bool TryGetAncestor<TContext>(this ParserRuleContext context, out TContext ancestor)
138+
{
139+
ancestor = context.GetAncestor<TContext>();
140+
return ancestor != null;
141+
}
142+
134143
private static TContext GetAncestor_Recursive<TContext>(ParserRuleContext context)
135144
{
136145
if (context == null)

Rubberduck.Parsing/Rewriter/RewriterInfo/VariableRewriterInfoFinder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ private static RewriterInfo GetRewriterInfo(VBAParser.VariableSubStmtContext var
2424
var itemIndex = items.ToList().IndexOf(variable);
2525
var count = items.Length;
2626

27-
if (context.Parent.Parent is VBAParser.ModuleDeclarationsElementContext element)
27+
if (context.TryGetAncestor<VBAParser.ModuleDeclarationsElementContext>(out var element))
2828
{
2929
return GetModuleVariableRemovalInfo(variable, element, count, itemIndex, items);
3030
}

Rubberduck.Parsing/Symbols/AliasDeclaration.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public AliasDeclaration(ComAlias alias, Declaration parent, QualifiedModuleName
1717
Accessibility.Public,
1818
DeclarationType.ComAlias,
1919
null,
20+
null,
2021
Selection.Home,
2122
false,
2223
null,

Rubberduck.Parsing/Symbols/ClassModuleDeclaration.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public ClassModuleDeclaration(
3939
Accessibility.Public,
4040
DeclarationType.ClassModule,
4141
null,
42+
null,
4243
Selection.Home,
4344
false,
4445
null,
@@ -78,6 +79,7 @@ public ClassModuleDeclaration(ComCoClass coClass, Declaration parent, QualifiedM
7879
Accessibility.Public,
7980
DeclarationType.ClassModule,
8081
null,
82+
null,
8183
Selection.Home,
8284
false,
8385
null,

Rubberduck.Parsing/Symbols/Declaration.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public Declaration(
3333
Accessibility accessibility,
3434
DeclarationType declarationType,
3535
ParserRuleContext context,
36+
ParserRuleContext attributesPassContext,
3637
Selection selection,
3738
bool isArray,
3839
VBAParser.AsTypeClauseContext asTypeContext,
@@ -51,6 +52,7 @@ public Declaration(
5152
accessibility,
5253
declarationType,
5354
context,
55+
attributesPassContext,
5456
selection,
5557
isArray,
5658
asTypeContext,
@@ -88,6 +90,7 @@ public Declaration(
8890
accessibility,
8991
declarationType,
9092
null,
93+
null,
9194
Selection.Home,
9295
isArray,
9396
asTypeContext,
@@ -107,6 +110,7 @@ public Declaration(
107110
Accessibility accessibility,
108111
DeclarationType declarationType,
109112
ParserRuleContext context,
113+
ParserRuleContext attributesPassContext,
110114
Selection selection,
111115
bool isArray,
112116
VBAParser.AsTypeClauseContext asTypeContext,
@@ -126,6 +130,7 @@ public Declaration(
126130
DeclarationType = declarationType;
127131
Selection = selection;
128132
Context = context;
133+
AttributesPassContext = attributesPassContext;
129134
IsUserDefined = isUserDefined;
130135
_annotations = annotations;
131136
_attributes = attributes ?? new Attributes();
@@ -159,6 +164,7 @@ public Declaration(ComEnumeration enumeration, Declaration parent, QualifiedModu
159164
Accessibility.Global,
160165
DeclarationType.Enumeration,
161166
null,
167+
null,
162168
Selection.Home,
163169
false,
164170
null,
@@ -178,6 +184,7 @@ public Declaration(ComStruct structure, Declaration parent, QualifiedModuleName
178184
Accessibility.Global,
179185
DeclarationType.UserDefinedType,
180186
null,
187+
null,
181188
Selection.Home,
182189
false,
183190
null,
@@ -196,6 +203,7 @@ public Declaration(ComEnumerationMember member, Declaration parent, QualifiedMod
196203
Accessibility.Global,
197204
DeclarationType.EnumerationMember,
198205
null,
206+
null,
199207
Selection.Home,
200208
false,
201209
null,
@@ -215,6 +223,7 @@ public Declaration(ComField field, Declaration parent, QualifiedModuleName modul
215223
Accessibility.Global,
216224
field.Type,
217225
null,
226+
null,
218227
Selection.Home,
219228
false,
220229
null,
@@ -282,6 +291,7 @@ public static Declaration GetProjectParent(Declaration declaration)
282291
public QualifiedModuleName QualifiedModuleName => QualifiedName.QualifiedModuleName;
283292

284293
public ParserRuleContext Context { get; }
294+
public ParserRuleContext AttributesPassContext { get; }
285295

286296
private ConcurrentBag<IdentifierReference> _references = new ConcurrentBag<IdentifierReference>();
287297
public IEnumerable<IdentifierReference> References => _references;

Rubberduck.Parsing/Symbols/DeclarationFinder.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -680,9 +680,23 @@ public Declaration OnUndeclaredVariable(Declaration enclosingProcedure, string i
680680
var undeclaredLocal =
681681
new Declaration(
682682
new QualifiedMemberName(enclosingProcedure.QualifiedName.QualifiedModuleName, identifierName),
683-
enclosingProcedure, enclosingProcedure, "Variant", string.Empty, false, false,
684-
Accessibility.Implicit, DeclarationType.Variable, context, context.GetSelection(), false, null,
685-
true, annotations, null, true);
683+
enclosingProcedure,
684+
enclosingProcedure,
685+
"Variant",
686+
string.Empty,
687+
false,
688+
false,
689+
Accessibility.Implicit,
690+
DeclarationType.Variable,
691+
context,
692+
null,
693+
context.GetSelection(),
694+
false,
695+
null,
696+
true,
697+
annotations,
698+
null,
699+
true);
686700

687701
var hasUndeclared = _newUndeclared.ContainsKey(enclosingProcedure.QualifiedName);
688702
if (hasUndeclared)
@@ -738,7 +752,7 @@ public Declaration OnBracketedExpression(string expression, ParserRuleContext co
738752
return undeclared.SingleOrDefault();
739753
}
740754

741-
var item = new Declaration(qualifiedName, hostApp, hostApp, Tokens.Variant, string.Empty, false, false, Accessibility.Global, DeclarationType.BracketedExpression, context, context.GetSelection(), true, null);
755+
var item = new Declaration(qualifiedName, hostApp, hostApp, Tokens.Variant, string.Empty, false, false, Accessibility.Global, DeclarationType.BracketedExpression, context, null, context.GetSelection(), true, null);
742756
_newUndeclared.TryAdd(qualifiedName, new ConcurrentBag<Declaration> { item });
743757
return item;
744758
}

0 commit comments

Comments
 (0)