Skip to content

Commit 2b771bd

Browse files
authored
Merge pull request #32 from comroid-git/super-ctor-calls
Handle Super-Constructor calls
2 parents da3b479 + 57fad33 commit 2b771bd

File tree

21 files changed

+229
-304
lines changed

21 files changed

+229
-304
lines changed

examples/PrintNumbers.kscr

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.comroid.kscr.test;
22

33
import org.comroid.kscr.core.Throwable;
44
import org.comroid.kscr.core.Sequencable;
5+
import org.comroid.kscr.time.DateTime;
56

67
public class PrintNumbers implements Throwable {
78
public static int StackSize => 64;
@@ -23,6 +24,7 @@ public class PrintNumbers implements Throwable {
2324
// stdio <<- "first argument is:" + args[0] + endl
2425
// <<- "args array is " + args + endl;
2526
public static void main() {
27+
DateTime datetime = new DateTime(3, 4);
2628

2729
int[] xy = new int[6];
2830
stdio <<- "array size is " + xy.length() + endl;

grammar/KScrParser.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ indexerDecl: LSQUAR type idPart (COMMA type idPart)* RSQUAR;
113113
indexerExpr: LSQUAR expr (COMMA expr)* RSQUAR;
114114
cast: LPAREN type COLON expr RPAREN;
115115
declaration: type idPart (ASSIGN expr)?;
116-
mutation: binaryop? ASSIGN expr;
116+
mutation: (binaryop | binaryop_late)? ASSIGN expr;
117117
call: idPart arguments;
118118
ctorCall: NEW type arguments;
119119
newArray: NEW type indexerExpr;

kscr-bytecode/Adapter/BytecodeAdapterV0_10.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ protected override void WriteMethod(Stream stream, StringCache strings, Method m
139139
Write(stream, strings, mtd.ReturnType.FullDetailedName);
140140
Write(stream, strings, mtd.SourceLocation);
141141
Write(stream, strings, mtd.Parameters.ToArray());
142+
if (mtd.Name == Method.ConstructorName)
143+
Write(stream, strings, mtd.SuperCalls.ToArray());
142144
Write(stream, strings, mtd.Body);
143145
}
144146

@@ -158,9 +160,14 @@ protected override Method ReadMethod(RuntimeBase vm, Stream stream, StringCache
158160
returnType = vm.FindType(ReadString(stream, strings));
159161
srcPos = Load<SourcefilePosition>(vm, strings, stream, pkg, cls);
160162
var parameters = ReadArray<MethodParameter>(vm, stream, strings, pkg, cls);
163+
StatementComponent[]? supers = name == Method.ConstructorName
164+
? ReadArray<StatementComponent>(vm, stream, strings, pkg, cls)
165+
: null;
161166
var body = Load<ExecutableCode>(vm, strings, stream, pkg, cls);
162167
var mtd = new Method(srcPos, cls!, name, returnType, mod) { Body = body };
163168
mtd.Parameters.AddRange(parameters);
169+
if (supers != null)
170+
mtd.SuperCalls.AddRange(supers);
164171
return mtd;
165172
}
166173

kscr-compiler/KScr/Compiler/AbstractVisitor.cs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ namespace KScr.Compiler;
1616

1717
public abstract class AbstractVisitor<T> : KScrParserBaseVisitor<T>
1818
{
19-
protected AbstractVisitor(RuntimeBase vm, CompilerContext ctx)
19+
protected AbstractVisitor(CompilerRuntime vm, CompilerContext ctx)
2020
{
2121
this.vm = vm;
2222
this.ctx = ctx;
2323
}
2424

25-
protected RuntimeBase vm { get; }
25+
protected CompilerRuntime vm { get; }
2626
protected CompilerContext ctx { get; }
2727
protected ITypeInfo? RequestedType { get; init; }
2828

@@ -72,19 +72,6 @@ protected TypeParameter VisitTypeParameter(KScrParser.GenericTypeDefContext gtd)
7272
return new TypeParameter(name, spec, target.AsClassInstance(vm)) { DefaultValue = def };
7373
}
7474

75-
protected IClassMember VisitClassMember(KScrParser.MemberContext member)
76-
{
77-
return member.RuleIndex switch
78-
{
79-
KScrParser.RULE_methodDecl or KScrParser.RULE_constructorDecl or KScrParser.RULE_initDecl
80-
or KScrParser.RULE_propertyDecl or KScrParser.RULE_member
81-
=> new ClassMemberVisitor(vm, ctx).Visit(member),
82-
KScrParser.RULE_classDecl => new ClassVisitor(vm, ctx).Visit(member),
83-
_ => throw new ArgumentOutOfRangeException(nameof(member.RuleIndex), member.RuleIndex,
84-
"Invalid Rule for member: " + member)
85-
};
86-
}
87-
8875
protected ExecutableCode VisitCode(ParserRuleContext? code)
8976
{
9077
return code == null ? new ExecutableCode() : new CodeblockVisitor(vm, ctx).Visit(code);

kscr-compiler/KScr/Compiler/Class/ClassMemberVisitor.cs

Lines changed: 0 additions & 123 deletions
This file was deleted.

kscr-compiler/KScr/Compiler/Class/ClassVisitor.cs

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace KScr.Compiler.Class;
88

99
public class ClassInfoVisitor : AbstractVisitor<ClassInfo>
1010
{
11-
public ClassInfoVisitor(RuntimeBase vm, CompilerContext ctx) : base(vm, ctx)
11+
public ClassInfoVisitor(CompilerRuntime vm, CompilerContext ctx) : base(vm, ctx)
1212
{
1313
}
1414

@@ -26,37 +26,6 @@ public override ClassInfo VisitClassDecl(KScrParser.ClassDeclContext context)
2626
}
2727
}
2828

29-
public class ClassVisitor : AbstractVisitor<Core.Std.Class>
30-
{
31-
public ClassVisitor(RuntimeBase vm, CompilerContext ctx) : base(vm, ctx)
32-
{
33-
}
34-
35-
private Core.Std.Class cls => ctx.Class!.AsClass(vm);
36-
37-
public override Core.Std.Class VisitClassDecl(KScrParser.ClassDeclContext context)
38-
{
39-
if (context.genericTypeDefs() is { } defs)
40-
foreach (var genTypeDef in defs.genericTypeDef())
41-
if (cls.TypeParameters.All(x => x.Name != genTypeDef.idPart().GetText()))
42-
cls.TypeParameters.Add(VisitTypeParameter(genTypeDef));
43-
if (context.objectExtends() is { } ext)
44-
foreach (var extendsType in ext.type())
45-
cls.DeclaredSuperclasses.Add(VisitTypeInfo(extendsType).AsClassInstance(vm));
46-
if (context.objectImplements() is { } impl)
47-
foreach (var implementsType in impl.type())
48-
cls.DeclaredInterfaces.Add(VisitTypeInfo(implementsType).AsClassInstance(vm));
49-
50-
foreach (var each in context.member())
51-
{
52-
var member = VisitClassMember(each);
53-
cls.DeclaredMembers[member.Name] = member;
54-
}
55-
56-
return cls;
57-
}
58-
}
59-
6029
public class ModifierVisitor : KScrParserBaseVisitor<MemberModifier>
6130
{
6231
public override MemberModifier VisitModPublic(KScrParser.ModPublicContext context)

kscr-compiler/KScr/Compiler/Code/CodeblockVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace KScr.Compiler.Code;
88

99
public class CodeblockVisitor : AbstractVisitor<ExecutableCode>
1010
{
11-
public CodeblockVisitor(RuntimeBase vm, CompilerContext ctx) : base(vm, ctx)
11+
public CodeblockVisitor(CompilerRuntime vm, CompilerContext ctx) : base(vm, ctx)
1212
{
1313
}
1414

kscr-compiler/KScr/Compiler/Code/ExpressionVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace KScr.Compiler.Code;
1010

1111
public class ExpressionVisitor : AbstractVisitor<StatementComponent>
1212
{
13-
public ExpressionVisitor(RuntimeBase vm, CompilerContext ctx) : base(vm, ctx)
13+
public ExpressionVisitor(CompilerRuntime vm, CompilerContext ctx) : base(vm, ctx)
1414
{
1515
}
1616

kscr-compiler/KScr/Compiler/Code/StatementVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace KScr.Compiler.Code;
88

99
public class StatementVisitor : AbstractVisitor<Statement>
1010
{
11-
public StatementVisitor(RuntimeBase vm, CompilerContext ctx) : base(vm, ctx)
11+
public StatementVisitor(CompilerRuntime vm, CompilerContext ctx) : base(vm, ctx)
1212
{
1313
}
1414

kscr-compiler/KScr/Compiler/Code/TypeInfoVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace KScr.Compiler.Code;
1010

1111
public class TypeInfoVisitor : AbstractVisitor<ITypeInfo>
1212
{
13-
public TypeInfoVisitor(RuntimeBase vm, CompilerContext ctx) : base(vm, ctx)
13+
public TypeInfoVisitor(CompilerRuntime vm, CompilerContext ctx) : base(vm, ctx)
1414
{
1515
}
1616

0 commit comments

Comments
 (0)