Skip to content

Commit

Permalink
TSExternsGenerator: update
Browse files Browse the repository at this point in the history
  • Loading branch information
joshtynjala committed Feb 6, 2025
1 parent 00fd35a commit 1b45527
Showing 1 changed file with 79 additions and 48 deletions.
127 changes: 79 additions & 48 deletions scripts/TSExternsGenerator.hx
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,14 @@ class TSExternsGenerator {
while (type != null) {
switch (type) {
case TInst(t, params):
baseType = t.get();
var classType = t.get();
switch (classType.kind) {
case KTypeParameter(constraints):
// don't let Vector<T> become Vector<any>
return false;
default:
}
baseType = classType;
break;
case TEnum(t, params):
baseType = t.get();
Expand Down Expand Up @@ -1274,7 +1281,7 @@ class TSExternsGenerator {
}

if (QNAMES_TO_REWRITE.exists(qname)) {
return QNAMES_TO_REWRITE.get(qname);
qname = QNAMES_TO_REWRITE.get(qname);
}

if (!includeParams || params.length == 0) {
Expand Down Expand Up @@ -1311,7 +1318,7 @@ class TSExternsGenerator {
}

if (QNAMES_TO_REWRITE.exists(qname)) {
return QNAMES_TO_REWRITE.get(qname);
qname = QNAMES_TO_REWRITE.get(qname);
}

var foundImportMapping = false;
Expand Down Expand Up @@ -1340,93 +1347,117 @@ class TSExternsGenerator {
return buffer.toString();
}

private function abstractTypeToUnqualifiedName(abstractType:AbstractType, params:Array<Type>, includeParams:Bool = true):String {
private function abstractTypeToUnqualifiedName(abstractType:AbstractType, abstractTypeParams:Array<Type>, includeParams:Bool = true):String {
if (abstractType.meta.has(":enum") && !shouldSkipBaseType(abstractType, true)) {
return baseTypeToUnqualifiedName(abstractType, params, includeParams);
return baseTypeToUnqualifiedName(abstractType, abstractTypeParams, includeParams);
}
var pack = abstractType.pack;
if (abstractType.name == "Null" && pack.length == 0) {
return macroTypeToUnqualifiedName(params[0], includeParams);
if (abstractType.name == "Null" && abstractType.pack.length == 0) {
return macroTypeToUnqualifiedName(abstractTypeParams[0], includeParams);
}
if (abstractType.name == "Function" && abstractType.pack.length == 1 && abstractType.pack[0] == "haxe") {
return "Function";
}
var underlyingType = abstractType.type;
switch (underlyingType) {
case TAbstract(t, underlyingParams):
var result = baseTypeToQname(abstractType, params, false);
var result = baseTypeToQname(abstractType, abstractTypeParams, false);
var compareTo = baseTypeToQname(t.get(), underlyingParams, false);
if (result == compareTo) {
// this avoids an infinite loop
return baseTypeToUnqualifiedName(abstractType, params, includeParams);
return baseTypeToUnqualifiedName(abstractType, abstractTypeParams, includeParams);
}
default:
}

if (includeParams) {
var qname = macroTypeToQname(underlyingType, false);
if (options != null && options.renameSymbols != null) {
var renameSymbols = options.renameSymbols;
var i = 0;
while (i < renameSymbols.length) {
var originalName = renameSymbols[i];
i++;
var newName = renameSymbols[i];
i++;
if (newName == qname) {
// don't use underlyingType's parameters
return macroTypeToUnqualifiedName(underlyingType, false) + generateUnqualifiedParams(params);
}
}
var abstractTypeQname = baseTypeToQname(abstractType, abstractTypeParams, false);
var paramsToInclude:Array<Type> = null;
switch (underlyingType) {
case TInst(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams.map((param) -> {
return translateTypeParam(param, abstractTypeQname, abstractType.params, abstractTypeParams);
});
case TAbstract(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams;
case TEnum(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams;
case TType(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams;
default:
paramsToInclude = [];
}
return macroTypeToUnqualifiedName(underlyingType, false) + generateUnqualifiedParams(paramsToInclude);
}

return macroTypeToUnqualifiedName(underlyingType, includeParams);
return macroTypeToUnqualifiedName(underlyingType, false);
}

private function abstractTypeToQname(abstractType:AbstractType, params:Array<Type>, includeParams:Bool = true):String {
private function abstractTypeToQname(abstractType:AbstractType, abstractTypeParams:Array<Type>, includeParams:Bool = true):String {
if (abstractType.meta.has(":enum") && !shouldSkipBaseType(abstractType, true)) {
return baseTypeToQname(abstractType, params, includeParams);
return baseTypeToQname(abstractType, abstractTypeParams, includeParams);
}
var pack = abstractType.pack;
if (abstractType.name == "Null" && pack.length == 0) {
return macroTypeToQname(params[0], includeParams);
if (abstractType.name == "Null" && abstractType.pack.length == 0) {
return macroTypeToQname(abstractTypeParams[0], includeParams);
}
if (abstractType.name == "Function" && abstractType.pack.length == 1 && abstractType.pack[0] == "haxe") {
return "Function";
}
var underlyingType = abstractType.type;
switch (underlyingType) {
case TAbstract(t, underlyingParams):
var result = baseTypeToQname(abstractType, params, false);
var result = baseTypeToQname(abstractType, abstractTypeParams, false);
var compareTo = baseTypeToQname(t.get(), underlyingParams, false);
if (result == compareTo) {
// this avoids an infinite loop
return baseTypeToQname(abstractType, params, includeParams);
return baseTypeToQname(abstractType, abstractTypeParams, includeParams);
}
default:
}

if (includeParams) {
var qname = macroTypeToQname(underlyingType, false);
if (options != null && options.renameSymbols != null) {
var renameSymbols = options.renameSymbols;
var i = 0;
while (i < renameSymbols.length) {
var originalName = renameSymbols[i];
i++;
var newName = renameSymbols[i];
i++;
if (newName == qname) {
// don't use underlyingType's parameters
return qname + generateQnameParams(params);
}
}
var abstractTypeQname = baseTypeToQname(abstractType, abstractTypeParams, false);
var paramsToInclude:Array<Type> = null;
switch (underlyingType) {
case TInst(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams.map((param) -> {
return translateTypeParam(param, abstractTypeQname, abstractType.params, abstractTypeParams);
});
case TAbstract(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams;
case TEnum(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams;
case TType(t, underlyingTypeParams):
paramsToInclude = underlyingTypeParams;
default:
paramsToInclude = [];
}
return macroTypeToQname(underlyingType, false) + generateQnameParams(paramsToInclude);
}

return macroTypeToQname(underlyingType, includeParams);
}

private function translateTypeParam(typeParam:Type, typeParametersQname:String, typeParameters:Array<TypeParameter>, params:Array<Type>):Type {
switch (typeParam) {
case TInst(t, _):
var classType = t.get();
switch (classType.kind) {
case KTypeParameter(constraints):
var typeParamSourceQname = classType.pack.join(".");
if (typeParamSourceQname == typeParametersQname) {
for (j in 0...typeParameters.length) {
var param = typeParameters[j];
if (param.name == classType.name) {
return params[j];
}
}
}
default:
}
default:
}
return typeParam;
}

private function writeGenerated(outputDirPath:String, baseType:BaseType, generated:String):Void {
var outputFilePath = getFileOutputPath(outputDirPath, baseType);
Expand Down

0 comments on commit 1b45527

Please sign in to comment.