Workaround for complexType parsing
This commit is contained in:
@@ -35,47 +35,23 @@ class Helpers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static function parseTypePath(path:String, from:ReaderExp):TypePath {
|
public static function parseTypePath(path:String, from:ReaderExp):TypePath {
|
||||||
// TODO function types with generic argument types are broken
|
return switch (parseComplexType(path, from)) {
|
||||||
var genericParts = path.split("<");
|
case TPath(path):
|
||||||
var typeParams:Array<TypeParam> = null;
|
path;
|
||||||
if (genericParts.length > 1) {
|
default:
|
||||||
typeParams = [
|
throw CompileError.fromExp(from, 'Haxe could not parse a type path from $path');
|
||||||
for (typeParam in genericParts[1].substr(0, genericParts[1].length - 1).split(",")) {
|
|
||||||
TPType(parseComplexType(typeParam, from));
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
var parts:List<String> = genericParts[0].trim().split(".");
|
|
||||||
var uppercaseParts:List<Bool> = parts.map(startsWithUpperCase);
|
|
||||||
for (isUpcase in uppercaseParts.slice(0, -2)) {
|
|
||||||
if (isUpcase) {
|
|
||||||
throw CompileError.fromExp(from, 'Type path $path should only have capitalized type and subtype');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var lastIsCap = uppercaseParts[-1];
|
|
||||||
var penultIsCap = uppercaseParts[-2];
|
|
||||||
|
|
||||||
return if (penultIsCap && lastIsCap) {
|
|
||||||
{
|
|
||||||
sub: parts[-1],
|
|
||||||
name: parts[-2],
|
|
||||||
pack: parts.slice(0, -2),
|
|
||||||
params: typeParams
|
|
||||||
};
|
|
||||||
} else if (lastIsCap) {
|
|
||||||
{
|
|
||||||
name: parts[-1],
|
|
||||||
pack: parts.slice(0, -1),
|
|
||||||
params: typeParams
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
throw CompileError.fromExp(from, 'Type path $path should end with a capitalized type');
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function parseComplexType(path:String, from:ReaderExp):ComplexType {
|
public static function parseComplexType(path:String, from:ReaderExp):ComplexType {
|
||||||
return TPath(parseTypePath(path, from));
|
// Trick Haxe into parsing it for us:
|
||||||
|
var typeCheckExpr = Context.parse('(thing : $path)', Context.currentPos());
|
||||||
|
return switch (typeCheckExpr.expr) {
|
||||||
|
case EParenthesis({pos: _, expr: ECheckType(_, complexType)}):
|
||||||
|
complexType;
|
||||||
|
default:
|
||||||
|
throw CompileError.fromExp(from, 'Haxe could not parse a complex type from $path, parsed ${typeCheckExpr.expr}');
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO generic type parameter declarations
|
// TODO generic type parameter declarations
|
||||||
|
@@ -254,6 +254,10 @@ class BasicTestCase extends Test {
|
|||||||
function testRest() {
|
function testRest() {
|
||||||
_testRest();
|
_testRest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testTypeParsing() {
|
||||||
|
_testTypeParsing();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BasicObject {
|
class BasicObject {
|
||||||
|
@@ -370,4 +370,16 @@
|
|||||||
(Assert.equals 15 (last myList)))
|
(Assert.equals 15 (last myList)))
|
||||||
|
|
||||||
(defun _testRest []
|
(defun _testRest []
|
||||||
(Assert.equals (.toString [2 3 4]) (.toString (rest [1 2 3 4]))))
|
(Assert.equals (.toString [2 3 4]) (.toString (rest [1 2 3 4]))))
|
||||||
|
|
||||||
|
(defun doSomething [:Int->Int func]
|
||||||
|
(func 5))
|
||||||
|
|
||||||
|
(defun itsAMonster [:Null<Map<String,Map<String,Array<String>>>> monsterArg] "but it still compiles")
|
||||||
|
|
||||||
|
(defun _testTypeParsing []
|
||||||
|
// Do stuff with functions that take complex type parameters, mostly just to check if it compiles
|
||||||
|
(Assert.equals 5 (doSomething (lambda [i] i)))
|
||||||
|
(Assert.equals 7 (doSomething (lambda [i] (+ i 2))))
|
||||||
|
// Pass null to the really crazy one because I'm lazy:
|
||||||
|
(Assert.equals "but it still compiles" (itsAMonster null)))
|
Reference in New Issue
Block a user