Skip to content

Commit fc3d45e

Browse files
committed
Work on substitution of generic members.
1 parent 874c0ff commit fc3d45e

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

Nitra/DotNetLang/Scopes/TopSubstScope.n

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,33 @@ namespace DotNet
4040

4141
private TrySubst(type : TypeSymbol) : TypeSymbol
4242
{
43-
// Это может быть сконструированный тип (у которого параметров типы уже подставлены или отсутствуют).
44-
// Возможно здесь имеет смысл сделать проверку на это и не делать для них подмены.
45-
mutable result;
46-
if (_typeParamsMap.TryGetValue(type.Id, out result))
47-
result
48-
else
49-
type
43+
match (type)
44+
{
45+
| TypeParameterSymbol =>
46+
mutable result;
47+
if (_typeParamsMap.TryGetValue(type.Id, out result))
48+
result
49+
else
50+
{
51+
assert2(false, "Unmapped TypeParameterSymbol!");
52+
type
53+
}
54+
55+
| ConstructedTypeSymbol as cts =>
56+
def typeInfo = cts.TypeInfo;
57+
def args = cts.Args;
58+
def substArgs = TrySubsts(args);
59+
def isNotChanged = args.Equals(substArgs);
60+
match (cts)
61+
{
62+
| TopConstructedTypeSymbol when isNotChanged => cts
63+
| TopConstructedTypeSymbol => AstUtils.CreateConstructedTypeSymbol(typeInfo, substArgs, DependentPropertyEvalContext(null))
64+
//| NestedConstructedTypeSymbol as cts when isNotChanged
65+
| NestedConstructedTypeSymbol as cts => AstUtils.CreateNestedConstructedTypeSymbol(cts.Parent, typeInfo, substArgs, DependentPropertyEvalContext(null))
66+
}
67+
68+
| _ => type
69+
}
5070
}
5171

5272
private TrySubsts(types : ImmutableArray[TypeSymbol]) : ImmutableArray[TypeSymbol]

Nitra/DotNetLang/Utils/AstUtils.n

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,11 @@ namespace DotNet
215215
}
216216

217217
public CreateNestedConstructedTypeSymbol(_loc : Location, parentTypeSubst : TypeSymbol, typeInfo : GenericTypeSymbol, arguments : ImmutableArray[TypeSymbol], context : DependentPropertyEvalContext) : ConstructedTypeSymbol
218+
{
219+
CreateNestedConstructedTypeSymbol(parentTypeSubst, typeInfo, arguments, context)
220+
}
221+
222+
public CreateNestedConstructedTypeSymbol(parentTypeSubst : TypeSymbol, typeInfo : GenericTypeSymbol, arguments : ImmutableArray[TypeSymbol], context : DependentPropertyEvalContext) : ConstructedTypeSymbol
218223
{
219224
def resultSymbol = NestedConstructedTypeSymbol();
220225
resultSymbol.Parent = parentTypeSubst;
@@ -225,7 +230,7 @@ namespace DotNet
225230
resultSymbol
226231
}
227232

228-
public CreateConstructedTypeSymbol(_loc : Location, typeInfo : GenericTypeSymbol, arguments : ImmutableArray[TypeSymbol], context : DependentPropertyEvalContext) : ConstructedTypeSymbol
233+
public CreateConstructedTypeSymbol(typeInfo : GenericTypeSymbol, arguments : ImmutableArray[TypeSymbol], context : DependentPropertyEvalContext) : ConstructedTypeSymbol
229234
{
230235
def resultSymbol = TopConstructedTypeSymbol();
231236
resultSymbol.TypeInfo = typeInfo;
@@ -234,6 +239,11 @@ namespace DotNet
234239
resultSymbol
235240
}
236241

242+
public CreateConstructedTypeSymbol(_loc : Location, typeInfo : GenericTypeSymbol, arguments : ImmutableArray[TypeSymbol], context : DependentPropertyEvalContext) : ConstructedTypeSymbol
243+
{
244+
CreateConstructedTypeSymbol(typeInfo, arguments, context)
245+
}
246+
237247
public MakeConstructedType(ast : ILocated, args : ImmutableArray[Ref[DeclarationSymbol]], context : DependentPropertyEvalContext) : ResolutionAlgorithm[DeclarationSymbol, DeclarationSymbol]
238248
{
239249
def loc = ast.Location;

0 commit comments

Comments
 (0)