Skip to content

Commit a300d15

Browse files
committed
Some null security in annotation ctors
Also some minor tweaks based on review remarks for PR #4641
1 parent f668115 commit a300d15

9 files changed

+16
-23
lines changed

Rubberduck.Parsing/Annotations/AttributeAnnotationBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public abstract class AttributeAnnotationBase : AnnotationBase, IAttributeAnnota
99
protected AttributeAnnotationBase(AnnotationType annotationType, QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IReadOnlyList<string> attributeValues)
1010
:base(annotationType, qualifiedSelection, context)
1111
{
12-
AttributeValues = attributeValues;
12+
AttributeValues = attributeValues ?? new List<string>();
1313
}
1414

1515
public abstract string Attribute { get; }

Rubberduck.Parsing/Annotations/DefaultMemberAnnotation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public sealed class DefaultMemberAnnotation : AttributeAnnotationBase
1313
public DefaultMemberAnnotation(QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IEnumerable<string> parameters)
1414
: base(AnnotationType.DefaultMember, qualifiedSelection, context, new List<string> { "0" })
1515
{
16-
Description = parameters.FirstOrDefault();
16+
Description = parameters?.FirstOrDefault() ?? string.Empty;
1717
}
1818

1919
public string Description { get; }

Rubberduck.Parsing/Annotations/DescriptionAnnotation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Rubberduck.Parsing.Annotations
1111
public sealed class DescriptionAnnotation : AttributeAnnotationBase
1212
{
1313
public DescriptionAnnotation(QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IEnumerable<string> parameters)
14-
: base(AnnotationType.Description, qualifiedSelection, context, parameters.Take(1).ToList())
14+
: base(AnnotationType.Description, qualifiedSelection, context, parameters?.Take(1).ToList())
1515
{
1616
Description = AttributeValues?.FirstOrDefault();
1717
if ((Description?.StartsWith("\"") ?? false) && Description.EndsWith("\""))

Rubberduck.Parsing/Annotations/ExposedModuleAnnotation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Rubberduck.Parsing.Annotations
1010
public sealed class ExposedModuleAnnotation : AttributeAnnotationBase
1111
{
1212
public ExposedModuleAnnotation(QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IEnumerable<string> parameters)
13-
: base(AnnotationType.Exposed, qualifiedSelection, context, new List<string> { "True" })
13+
: base(AnnotationType.Exposed, qualifiedSelection, context, new List<string> { Tokens.True })
1414
{
1515

1616
}

Rubberduck.Parsing/Annotations/MemberAttributeAnnotation.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ namespace Rubberduck.Parsing.Annotations
88
public class MemberAttributeAnnotation : AttributeAnnotationBase
99
{
1010
public MemberAttributeAnnotation(QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IReadOnlyList<string> parameters)
11-
:base(AnnotationType.MemberAttribute, qualifiedSelection, context, parameters.Skip(1).ToList())
11+
:base(AnnotationType.MemberAttribute, qualifiedSelection, context, parameters?.Skip(1).ToList())
1212
{
13-
Attribute = parameters.FirstOrDefault();
13+
Attribute = parameters?.FirstOrDefault() ?? string.Empty;
1414
}
1515

1616
public override string Attribute { get; }

Rubberduck.Parsing/Annotations/ModuleAttributeAnnotation.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ namespace Rubberduck.Parsing.Annotations
88
public class ModuleAttributeAnnotation : AttributeAnnotationBase
99
{
1010
public ModuleAttributeAnnotation(QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IReadOnlyList<string> paramaters)
11-
:base(AnnotationType.ModuleAttribute, qualifiedSelection, context, paramaters.Skip(1).ToList())
11+
:base(AnnotationType.ModuleAttribute, qualifiedSelection, context, paramaters?.Skip(1).ToList())
1212
{
13-
Attribute = paramaters.FirstOrDefault();
13+
Attribute = paramaters?.FirstOrDefault() ?? string.Empty;
1414
}
1515

1616
public override string Attribute { get; }

Rubberduck.Parsing/Annotations/ModuleDescriptionAnnotation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Rubberduck.Parsing.Annotations
1111
public sealed class ModuleDescriptionAnnotation : AttributeAnnotationBase
1212
{
1313
public ModuleDescriptionAnnotation(QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IEnumerable<string> attributeValues)
14-
: base(AnnotationType.ModuleDescription, qualifiedSelection, context, attributeValues.Take(1).ToList())
14+
: base(AnnotationType.ModuleDescription, qualifiedSelection, context, attributeValues?.Take(1).ToList())
1515
{
1616
Description = AttributeValues?.FirstOrDefault();
1717
if ((Description?.StartsWith("\"") ?? false) && Description.EndsWith("\""))

Rubberduck.Parsing/Annotations/PredeclaredIdAnnotation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Rubberduck.Parsing.Annotations
1010
public sealed class PredeclaredIdAnnotation : AttributeAnnotationBase
1111
{
1212
public PredeclaredIdAnnotation(QualifiedSelection qualifiedSelection, VBAParser.AnnotationContext context, IEnumerable<string> parameters)
13-
: base(AnnotationType.PredeclaredId, qualifiedSelection, context, new List<string>{"True"})
13+
: base(AnnotationType.PredeclaredId, qualifiedSelection, context, new List<string>{Tokens.True})
1414
{}
1515

1616
public override string Attribute => "VB_PredeclaredId";

Rubberduck.Parsing/VBA/AttributesUpdater.cs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ public void AddAttribute(IRewriteSession rewriteSession, Declaration declaration
6363
if (lastModuleAttribute == null)
6464
{
6565
//This should never happen for a real module.
66-
var codeToInsert = $"Attribute {attribute} ={AttributeValuesText(values)}{Environment.NewLine}";
66+
var codeToInsert = $"Attribute {attribute} = {AttributeValuesText(values)}{Environment.NewLine}";
6767
rewriter.InsertBefore(0, codeToInsert);
6868
}
6969
else
7070
{
71-
var codeToInsert = $"{Environment.NewLine}Attribute {attribute} ={AttributeValuesText(values)}";
71+
var codeToInsert = $"{Environment.NewLine}Attribute {attribute} = {AttributeValuesText(values)}";
7272
rewriter.InsertAfter(lastModuleAttribute.stop.TokenIndex, codeToInsert);
7373
}
7474
}
@@ -78,27 +78,20 @@ public void AddAttribute(IRewriteSession rewriteSession, Declaration declaration
7878
var firstEndOfLineInMember = attributesContext.GetDescendent<VBAParser.EndOfLineContext>();
7979
if (firstEndOfLineInMember == null)
8080
{
81-
var codeToInsert = $"{Environment.NewLine}Attribute {attribute} ={AttributeValuesText(values)}";
81+
var codeToInsert = $"{Environment.NewLine}Attribute {attribute} = {AttributeValuesText(values)}";
8282
rewriter.InsertAfter(declaration.AttributesPassContext.Stop.TokenIndex, codeToInsert);
8383
}
8484
else
8585
{
86-
var codeToInsert = $"Attribute {attribute} ={AttributeValuesText(values)}{Environment.NewLine}";
86+
var codeToInsert = $"Attribute {attribute} = {AttributeValuesText(values)}{Environment.NewLine}";
8787
rewriter.InsertAfter(firstEndOfLineInMember.Stop.TokenIndex, codeToInsert);
8888
}
8989
}
9090
}
9191

9292
private static string AttributeValuesText(IEnumerable<string> attributeValues)
9393
{
94-
var builder = new StringBuilder();
95-
foreach (var attributeValue in attributeValues)
96-
{
97-
builder.Append($" {attributeValue},");
98-
}
99-
//Remove trailing comma.
100-
builder.Length--;
101-
return builder.ToString();
94+
return string.Join(", ", attributeValues);
10295
}
10396

10497
public void RemoveAttribute(IRewriteSession rewriteSession, Declaration declaration, string attribute, IReadOnlyList<string> values = null)
@@ -168,7 +161,7 @@ private static void UpdateAttributeValues(IModuleRewriter rewriter, AttributeNod
168161
var statementContext = nodeToUpdate.Context;
169162
var firstIndexToReplace = statementContext.EQ().Symbol.TokenIndex + 1;
170163
var lastIndexToReplace = statementContext.stop.TokenIndex;
171-
var replacementText = AttributeValuesText(values);
164+
var replacementText = $" {AttributeValuesText(values)}";
172165

173166
rewriter.Replace(new Interval(firstIndexToReplace, lastIndexToReplace), replacementText);
174167
}

0 commit comments

Comments
 (0)