Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d17f88b

Browse files
committed
C#: Remove assembly prefix from all extractor IDs
1 parent 7628caa commit d17f88b

40 files changed

Lines changed: 414 additions & 358 deletions

csharp/extractor/Semmle.Extraction.CIL/Entities/Assembly.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public static void ExtractCIL(Layout layout, string assemblyPath, ILogger logger
141141
trapFile = trapWriter.TrapFile;
142142
if (nocache || !System.IO.File.Exists(trapFile))
143143
{
144-
var cx = extractor.CreateContext(null, trapWriter, null);
144+
var cx = extractor.CreateContext(null, trapWriter, null, false);
145145
ExtractCIL(cx, assemblyPath, extractPdbs);
146146
extracted = true;
147147
}

csharp/extractor/Semmle.Extraction.CSharp/Analyser.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ public class Analyser : IDisposable
2525

2626
public readonly ILogger Logger;
2727

28-
public Analyser(IProgressMonitor pm, ILogger logger)
28+
public readonly bool AddAssemblyTrapPrefix;
29+
30+
public Analyser(IProgressMonitor pm, ILogger logger, bool addAssemblyTrapPrefix)
2931
{
3032
Logger = logger;
33+
AddAssemblyTrapPrefix = addAssemblyTrapPrefix;
3134
Logger.Log(Severity.Info, "EXTRACTION STARTING at {0}", DateTime.Now);
3235
stopWatch.Start();
3336
progressMonitor = pm;
@@ -231,7 +234,7 @@ void DoAnalyseCompilation(string cwd, string[] args)
231234
var projectLayout = layout.LookupProjectOrDefault(assemblyPath);
232235
var trapWriter = projectLayout.CreateTrapWriter(Logger, assemblyPath, true, options.TrapCompression);
233236
compilationTrapFile = trapWriter; // Dispose later
234-
var cx = extractor.CreateContext(compilation.Clone(), trapWriter, new AssemblyScope(assembly, assemblyPath, true));
237+
var cx = extractor.CreateContext(compilation.Clone(), trapWriter, new AssemblyScope(assembly, assemblyPath, true), AddAssemblyTrapPrefix);
235238

236239
compilationEntity = new Entities.Compilation(cx, cwd, args);
237240
}
@@ -286,7 +289,7 @@ void DoAnalyseAssembly(PortableExecutableReference r)
286289

287290
if (assembly != null)
288291
{
289-
var cx = extractor.CreateContext(c, trapWriter, new AssemblyScope(assembly, assemblyPath, false));
292+
var cx = extractor.CreateContext(c, trapWriter, new AssemblyScope(assembly, assemblyPath, false), AddAssemblyTrapPrefix);
290293

291294
foreach (var module in assembly.Modules)
292295
{
@@ -372,7 +375,7 @@ void DoExtractTree(SyntaxTree tree)
372375

373376
if (!upToDate)
374377
{
375-
Context cx = extractor.CreateContext(compilation.Clone(), trapWriter, new SourceScope(tree));
378+
Context cx = extractor.CreateContext(compilation.Clone(), trapWriter, new SourceScope(tree), AddAssemblyTrapPrefix);
376379
Populators.CompilationUnit.Extract(cx, tree.GetRoot());
377380
cx.PopulateAll();
378381
cx.ExtractComments(cx.CommentGenerator);

csharp/extractor/Semmle.Extraction.CSharp/Entities/CommentBlock.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void BindTo(Label entity, CommentBinding binding)
3535
Context.TrapWriter.Writer.commentblock_binding(this, entity, binding);
3636
}
3737

38-
public static CommentBlock Create(Context cx, ICommentBlock block) => CommentBlockFactory.Instance.CreateEntity(cx, block);
38+
public static CommentBlock Create(Context cx, ICommentBlock block) => CommentBlockFactory.Instance.CreateEntity(cx, block, block);
3939

4040
class CommentBlockFactory : ICachedEntityFactory<ICommentBlock, CommentBlock>
4141
{

csharp/extractor/Semmle.Extraction.CSharp/Entities/CommentLine.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,11 @@ public override void WriteId(TextWriter trapFile)
129129
trapFile.Write(";commentline");
130130
}
131131

132-
static CommentLine Create(Context cx, Microsoft.CodeAnalysis.Location loc, CommentLineType type, string text, string raw) => CommentLineFactory.Instance.CreateEntity(cx, loc, type, text, raw);
132+
static CommentLine Create(Context cx, Microsoft.CodeAnalysis.Location loc, CommentLineType type, string text, string raw)
133+
{
134+
var init = (loc, type, text, raw);
135+
return CommentLineFactory.Instance.CreateEntity(cx, init, init);
136+
}
133137

134138
class CommentLineFactory : ICachedEntityFactory<(Microsoft.CodeAnalysis.Location, CommentLineType, string, string), CommentLine>
135139
{

csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ public override void Populate(TextWriter trapFile)
101101

102102
public override void WriteId(TextWriter trapFile)
103103
{
104+
trapFile.WriteSubId(Type.Type);
105+
trapFile.Write(" ");
104106
trapFile.WriteSubId(ContainingType);
105107
trapFile.Write('.');
106108
trapFile.Write(symbol.Name);

csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ public void Overrides(TextWriter trapFile)
108108
/// </summary>
109109
protected static void BuildMethodId(Method m, TextWriter trapFile)
110110
{
111+
m.symbol.ReturnType.BuildOrWriteId(m.Context, trapFile, m.symbol);
112+
trapFile.Write(" ");
113+
111114
trapFile.WriteSubId(m.ContainingType);
112115

113116
AddExplicitInterfaceQualifierToId(m.Context, trapFile, m.symbol.ExplicitInterfaceImplementations);
@@ -129,7 +132,7 @@ protected static void BuildMethodId(Method m, TextWriter trapFile)
129132
// Type arguments with different nullability can result in
130133
// a constructed method with different nullability of its parameters and return type,
131134
// so we need to create a distinct database entity for it.
132-
trapFile.BuildList(",", m.symbol.GetAnnotatedTypeArguments(), (ta, tb0) => { ta.Symbol.BuildNestedTypeId(m.Context, tb0, m.symbol); trapFile.Write((int)ta.Nullability); });
135+
trapFile.BuildList(",", m.symbol.GetAnnotatedTypeArguments(), (ta, tb0) => { ta.Symbol.BuildOrWriteId(m.Context, tb0, m.symbol); trapFile.Write((int)ta.Nullability); });
133136
trapFile.Write('>');
134137
}
135138
}
@@ -171,13 +174,17 @@ protected static void AddParametersToId(Context cx, TextWriter trapFile, IMethod
171174
if (method.MethodKind == MethodKind.ReducedExtension)
172175
{
173176
trapFile.WriteSeparator(",", ref index);
174-
method.ReceiverType.BuildNestedTypeId(cx, trapFile, method);
177+
method.ReceiverType.BuildOrWriteId(cx, trapFile, method);
178+
trapFile.Write(" ");
179+
trapFile.Write(method.ReducedFrom.Parameters.First().Name);
175180
}
176181

177182
foreach (var param in method.Parameters)
178183
{
179184
trapFile.WriteSeparator(",", ref index);
180-
param.Type.BuildNestedTypeId(cx, trapFile, method);
185+
param.Type.BuildOrWriteId(cx, trapFile, method);
186+
trapFile.Write(" ");
187+
trapFile.Write(param.Name);
181188
switch (param.RefKind)
182189
{
183190
case RefKind.Out:
@@ -200,11 +207,8 @@ protected static void AddParametersToId(Context cx, TextWriter trapFile, IMethod
200207

201208
public static void AddExplicitInterfaceQualifierToId(Context cx, System.IO.TextWriter trapFile, IEnumerable<ISymbol> explicitInterfaceImplementations)
202209
{
203-
foreach (var i in explicitInterfaceImplementations)
204-
{
205-
trapFile.Write(';');
206-
i.ContainingType.BuildNestedTypeId(cx, trapFile, null);
207-
}
210+
if (explicitInterfaceImplementations.Any())
211+
trapFile.AppendList(",", explicitInterfaceImplementations.Select(impl => cx.CreateEntity(impl.ContainingType)));
208212
}
209213

210214
public virtual string Name => symbol.Name;

csharp/extractor/Semmle.Extraction.CSharp/Entities/Modifier.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,17 @@ public static void ExtractModifiers(Context cx, TextWriter trapFile, IEntity key
152152
}
153153
}
154154

155-
public static Modifier Create(Context cx, string modifier) =>
156-
ModifierFactory.Instance.CreateEntity(cx, new ModifierKey(modifier));
155+
public static Modifier Create(Context cx, string modifier)
156+
{
157+
var modifierKey = new ModifierKey(modifier);
158+
return ModifierFactory.Instance.CreateEntity(cx, modifierKey, modifierKey);
159+
}
157160

158-
public static Modifier Create(Context cx, Accessibility access) =>
159-
ModifierFactory.Instance.CreateEntity(cx, new ModifierKey(AccessbilityModifier(access)));
161+
public static Modifier Create(Context cx, Accessibility access)
162+
{
163+
var modifierKey = new ModifierKey(AccessbilityModifier(access));
164+
return ModifierFactory.Instance.CreateEntity(cx, modifierKey, modifierKey);
165+
}
160166

161167
class ModifierFactory : ICachedEntityFactory<ModifierKey, Modifier>
162168
{

csharp/extractor/Semmle.Extraction.CSharp/Entities/Namespace.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public override void WriteId(TextWriter trapFile)
3434
trapFile.Write(";namespace");
3535
}
3636

37-
public static Namespace Create(Context cx, INamespaceSymbol ns) => NamespaceFactory.Instance.CreateEntity2(cx, ns);
37+
public static Namespace Create(Context cx, INamespaceSymbol ns) => NamespaceFactory.Instance.CreateEntityFromSymbol(cx, ns);
3838

3939
class NamespaceFactory : ICachedEntityFactory<INamespaceSymbol, Namespace>
4040
{

csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ Kind ParamKind
6666
}
6767

6868
public static Parameter Create(Context cx, IParameterSymbol param, IEntity parent, Parameter original = null) =>
69-
ParameterFactory.Instance.CreateEntity(cx, param, parent, original);
69+
ParameterFactory.Instance.CreateEntity(cx, param, (param, parent, original));
7070

7171
public static Parameter Create(Context cx, IParameterSymbol param) =>
72-
ParameterFactory.Instance.CreateEntity(cx, param, null, null);
72+
ParameterFactory.Instance.CreateEntity(cx, param, (param, null, null));
7373

7474
public override void WriteId(TextWriter trapFile)
7575
{
@@ -202,7 +202,8 @@ public override bool Equals(object obj)
202202
return obj != null && obj.GetType() == typeof(VarargsType);
203203
}
204204

205-
public static VarargsType Create(Context cx) => VarargsTypeFactory.Instance.CreateNullableEntity(cx, null);
205+
static readonly object cacheKey = new object();
206+
public static VarargsType Create(Context cx) => VarargsTypeFactory.Instance.CreateEntity(cx, cacheKey, null);
206207

207208
class VarargsTypeFactory : ICachedEntityFactory<string, VarargsType>
208209
{
@@ -237,7 +238,8 @@ public override bool Equals(object obj)
237238
return obj != null && obj.GetType() == typeof(VarargsParam);
238239
}
239240

240-
public static VarargsParam Create(Context cx, Method method) => VarargsParamFactory.Instance.CreateEntity(cx, method);
241+
static readonly object cacheKey = new object();
242+
public static VarargsParam Create(Context cx, Method method) => VarargsParamFactory.Instance.CreateEntity(cx, cacheKey, method);
241243

242244
class VarargsParamFactory : ICachedEntityFactory<Method, VarargsParam>
243245
{
@@ -264,19 +266,27 @@ public override void Populate(TextWriter trapFile)
264266
trapFile.param_location(this, Original.Location);
265267
}
266268

267-
public override int GetHashCode() => symbol.GetHashCode() + 31 * ConstructedType.GetHashCode();
268-
269-
public override bool Equals(object obj)
269+
sealed class ConstructedExtensionParameterCacheKey
270270
{
271-
var other = obj as ConstructedExtensionParameter;
272-
if (other == null || other.GetType() != typeof(ConstructedExtensionParameter))
273-
return false;
271+
public readonly IParameterSymbol Parameter;
272+
public readonly ITypeSymbol ConstructedType;
273+
public ConstructedExtensionParameterCacheKey(IParameterSymbol parameter, ITypeSymbol constructedType)
274+
{
275+
Parameter = parameter;
276+
ConstructedType = constructedType;
277+
}
278+
279+
public override int GetHashCode() =>
280+
(Parameter, ConstructedType).GetHashCode();
274281

275-
return SymbolEqualityComparer.Default.Equals(symbol, other.symbol) && SymbolEqualityComparer.Default.Equals(ConstructedType, other.ConstructedType);
282+
public override bool Equals(object obj) =>
283+
obj is ConstructedExtensionParameterCacheKey k &&
284+
SymbolEqualityComparer.Default.Equals(k.Parameter, Parameter) &&
285+
SymbolEqualityComparer.Default.Equals(k.ConstructedType, ConstructedType);
276286
}
277287

278288
public static ConstructedExtensionParameter Create(Context cx, Method method, Parameter parameter) =>
279-
ExtensionParamFactory.Instance.CreateEntity(cx, (method, parameter));
289+
ExtensionParamFactory.Instance.CreateEntity(cx, new ConstructedExtensionParameterCacheKey(parameter.symbol, method.symbol.ReceiverType), (method, parameter));
280290

281291
class ExtensionParamFactory : ICachedEntityFactory<(Method, Parameter), ConstructedExtensionParameter>
282292
{

csharp/extractor/Semmle.Extraction.CSharp/Entities/Property.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,12 @@ class Property : CachedSymbol<IPropertySymbol>, IExpressionParentEntity
1313
protected Property(Context cx, IPropertySymbol init)
1414
: base(cx, init) { }
1515

16+
Type Type => Type.Create(Context, symbol.Type);
17+
1618
public override void WriteId(TextWriter trapFile)
1719
{
20+
trapFile.WriteSubId(Type);
21+
trapFile.Write(" ");
1822
trapFile.WriteSubId(ContainingType);
1923
trapFile.Write('.');
2024
Method.AddExplicitInterfaceQualifierToId(Context, trapFile, symbol.ExplicitInterfaceImplementations);
@@ -31,7 +35,7 @@ public override void Populate(TextWriter trapFile)
3135
PopulateNullability(trapFile, symbol.GetAnnotatedType());
3236
PopulateRefKind(trapFile, symbol.RefKind);
3337

34-
var type = Type.Create(Context, symbol.Type);
38+
var type = Type;
3539
trapFile.properties(this, symbol.GetName(), ContainingType, type.TypeRef, Create(Context, symbol.OriginalDefinition));
3640

3741
var getter = symbol.GetMethod;

0 commit comments

Comments
 (0)