(new [type] ...)
This commit is contained in:
@@ -55,7 +55,7 @@ class FieldForms {
|
|||||||
access: access,
|
access: access,
|
||||||
kind: FVar(switch (args[0]) {
|
kind: FVar(switch (args[0]) {
|
||||||
case TypedExp(type, _):
|
case TypedExp(type, _):
|
||||||
Helpers.parseTypePath(type);
|
Helpers.parseComplexType(type);
|
||||||
default: null;
|
default: null;
|
||||||
}, convert(args[1])),
|
}, convert(args[1])),
|
||||||
pos: Context.currentPos()
|
pos: Context.currentPos()
|
||||||
@@ -90,7 +90,7 @@ class FieldForms {
|
|||||||
},
|
},
|
||||||
type: switch (funcArg) {
|
type: switch (funcArg) {
|
||||||
case TypedExp(type, _):
|
case TypedExp(type, _):
|
||||||
Helpers.parseTypePath(type);
|
Helpers.parseComplexType(type);
|
||||||
default: null;
|
default: null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ class FieldForms {
|
|||||||
throw '${args[1]} should be an argument list';
|
throw '${args[1]} should be an argument list';
|
||||||
},
|
},
|
||||||
ret: switch (args[0]) {
|
ret: switch (args[0]) {
|
||||||
case TypedExp(type, _): Helpers.parseTypePath(type);
|
case TypedExp(type, _): Helpers.parseComplexType(type);
|
||||||
default: null;
|
default: null;
|
||||||
},
|
},
|
||||||
expr: {
|
expr: {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class Helpers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO this doesn't parse generic typeparams yet
|
// TODO this doesn't parse generic typeparams yet
|
||||||
public static function parseTypePath(path:String):ComplexType {
|
public static function parseTypePath(path:String):TypePath {
|
||||||
var parts:List<String> = path.split(".");
|
var parts:List<String> = path.split(".");
|
||||||
var uppercaseParts:List<Bool> = parts.map(startsWithUpperCase);
|
var uppercaseParts:List<Bool> = parts.map(startsWithUpperCase);
|
||||||
for (isUpcase in uppercaseParts.slice(0, -2)) {
|
for (isUpcase in uppercaseParts.slice(0, -2)) {
|
||||||
@@ -28,7 +28,8 @@ class Helpers {
|
|||||||
}
|
}
|
||||||
var lastIsCap = uppercaseParts[-1];
|
var lastIsCap = uppercaseParts[-1];
|
||||||
var penultIsCap = uppercaseParts[-2];
|
var penultIsCap = uppercaseParts[-2];
|
||||||
return TPath(if (lastIsCap && penultIsCap) {
|
|
||||||
|
return if (lastIsCap && penultIsCap) {
|
||||||
{
|
{
|
||||||
sub: parts[-1],
|
sub: parts[-1],
|
||||||
name: parts[-2],
|
name: parts[-2],
|
||||||
@@ -41,6 +42,10 @@ class Helpers {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
throw 'Type path $path should end with a capitalized type';
|
throw 'Type path $path should end with a capitalized type';
|
||||||
});
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function parseComplexType(path:String):ComplexType {
|
||||||
|
return TPath(parseTypePath(path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,16 @@ class SpecialForms {
|
|||||||
|
|
||||||
// TODO special form for object declaration
|
// TODO special form for object declaration
|
||||||
|
|
||||||
// TODO special form for new
|
map["new"] = (args:Array<ReaderExp>, convert:ExprConversion) -> {
|
||||||
|
if (args.length < 1) {
|
||||||
|
throw '(new [type] constructorArgs...) is missing a type!';
|
||||||
|
}
|
||||||
|
var classType = switch (args[0]) {
|
||||||
|
case Symbol(name): name;
|
||||||
|
default: throw 'first arg in (new [type] ...) should be a class to instantiate';
|
||||||
|
};
|
||||||
|
ENew(Helpers.parseTypePath(classType), args.slice(1).map(convert)).withPos();
|
||||||
|
};
|
||||||
|
|
||||||
// TODO special form for assignment
|
// TODO special form for assignment
|
||||||
|
|
||||||
@@ -54,7 +63,7 @@ class SpecialForms {
|
|||||||
},
|
},
|
||||||
type: switch (bindingPair[0]) {
|
type: switch (bindingPair[0]) {
|
||||||
case TypedExp(type, _):
|
case TypedExp(type, _):
|
||||||
Helpers.parseTypePath(type);
|
Helpers.parseComplexType(type);
|
||||||
default: null;
|
default: null;
|
||||||
},
|
},
|
||||||
isFinal: true, // Let's give (let...) variable immutability a try
|
isFinal: true, // Let's give (let...) variable immutability a try
|
||||||
@@ -88,7 +97,7 @@ class SpecialForms {
|
|||||||
throw '(the [type] [value]) expression has wrong number of arguments: ${args.length}';
|
throw '(the [type] [value]) expression has wrong number of arguments: ${args.length}';
|
||||||
}
|
}
|
||||||
ECheckType(convert(args[1]), switch (args[0]) {
|
ECheckType(convert(args[1]), switch (args[0]) {
|
||||||
case Symbol(type): Helpers.parseTypePath(type);
|
case Symbol(type): Helpers.parseComplexType(type);
|
||||||
default: throw 'first argument to (the... ) should be a valid type';
|
default: throw 'first argument to (the... ) should be a valid type';
|
||||||
}).withPos();
|
}).withPos();
|
||||||
};
|
};
|
||||||
@@ -110,7 +119,7 @@ class SpecialForms {
|
|||||||
},
|
},
|
||||||
type: switch (catchArgs[0]) {
|
type: switch (catchArgs[0]) {
|
||||||
case ListExp([TypedExp(type, _)]):
|
case ListExp([TypedExp(type, _)]):
|
||||||
Helpers.parseTypePath(type);
|
Helpers.parseComplexType(type);
|
||||||
default: null;
|
default: null;
|
||||||
},
|
},
|
||||||
expr: convert(CallExp(Symbol("begin"), catchArgs.slice(1)))
|
expr: convert(CallExp(Symbol("begin"), catchArgs.slice(1)))
|
||||||
|
|||||||
@@ -151,4 +151,8 @@ class BasicTestCase extends Test {
|
|||||||
function testLet() {
|
function testLet() {
|
||||||
_testLet();
|
_testLet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testConstructors() {
|
||||||
|
Assert.equals("sup", BasicTestCase.myConstructedString);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,4 +99,6 @@
|
|||||||
:String c "stuff"]
|
:String c "stuff"]
|
||||||
(Assert.equals 5 a)
|
(Assert.equals 5 a)
|
||||||
(Assert.equals 6 b)
|
(Assert.equals 6 b)
|
||||||
(Assert.equals "stuff" c)))
|
(Assert.equals "stuff" c)))
|
||||||
|
|
||||||
|
(defvar myConstructedString (new String "sup"))
|
||||||
Reference in New Issue
Block a user