From d66dbfb783f0750e0a0049ae32ff28771bca7cf8 Mon Sep 17 00:00:00 2001 From: Alexander Pavlyuk Date: Wed, 14 Dec 2022 16:32:19 +0300 Subject: [PATCH 01/13] Support of varargs functions is done. The bug in java.lang.String API mapping rules is fixed. Change-Id: Iff3a0eedad0b48be664efb08a5220ddc38cd5608 Signed-off-by: Alexander Pavlyuk --- migrator/config/java-api-mapper.xml | 49 +- .../Java_API_to_ArkTS_API_mapping_rules.docx | Bin 14971 -> 14731 bytes migrator/docs/java-api-list.xml | 2 +- migrator/docs/java-api-mapper.xml | 417 ------------------ .../apimapper/ArrayLiteralExpression.java | 1 + .../migrator/apimapper/BinaryExpression.java | 2 + .../migrator/apimapper/CastExpression.java | 6 +- .../com/ohos/migrator/apimapper/Literal.java | 4 +- .../ohos/migrator/apimapper/PrimaryType.java | 6 +- .../migrator/apimapper/TernaryExpression.java | 4 +- .../migrator/apimapper/UnaryExpression.java | 4 +- .../com/ohos/migrator/java/JavaApiMapper.java | 38 +- .../ohos/migrator/java/JavaTransformer.java | 103 ++++- .../CallExpressionRulesString.java | 42 ++ .../CallExpressionRulesString.java.sts | 38 ++ 15 files changed, 243 insertions(+), 473 deletions(-) delete mode 100644 migrator/docs/java-api-mapper.xml create mode 100644 migrator/test/java-mapper/CallExpressionRulesString.java create mode 100644 migrator/test/java-mapper/CallExpressionRulesString.java.sts diff --git a/migrator/config/java-api-mapper.xml b/migrator/config/java-api-mapper.xml index ed623b641..122e901f5 100644 --- a/migrator/config/java-api-mapper.xml +++ b/migrator/config/java-api-mapper.xml @@ -650,7 +650,7 @@ - + + - + - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -736,6 +746,15 @@ --> + + + + + + + + diff --git a/migrator/docs/Java_API_to_ArkTS_API_mapping_rules.docx b/migrator/docs/Java_API_to_ArkTS_API_mapping_rules.docx index 546e10db26560dce2b175475fd9fb67838fe1cc6..e6f1302a6ebbe47c18bb9844ff916d6052d4cf3f 100644 GIT binary patch delta 10051 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 delta 10293 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 DX^MeG diff --git a/migrator/docs/java-api-list.xml b/migrator/docs/java-api-list.xml index 4ffec05bc..a312142e7 100644 --- a/migrator/docs/java-api-list.xml +++ b/migrator/docs/java-api-list.xml @@ -93,7 +93,7 @@ // Interfaces: java.lang.Appendable java.lang.AutoCloseable - java.lang.CharSequence + java.lang.CharSequence ==> std.core.String ???? java.lang.Cloneable ==> std.core.Comparable diff --git a/migrator/docs/java-api-mapper.xml b/migrator/docs/java-api-mapper.xml deleted file mode 100644 index bba24e162..000000000 --- a/migrator/docs/java-api-mapper.xml +++ /dev/null @@ -1,417 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/migrator/src/com/ohos/migrator/apimapper/ArrayLiteralExpression.java b/migrator/src/com/ohos/migrator/apimapper/ArrayLiteralExpression.java index a582394c7..ed9f1b785 100644 --- a/migrator/src/com/ohos/migrator/apimapper/ArrayLiteralExpression.java +++ b/migrator/src/com/ohos/migrator/apimapper/ArrayLiteralExpression.java @@ -109,6 +109,7 @@ public class ArrayLiteralExpression extends ArrayList { public SingleExpressionContext buildArktsNode(List arktsOrigArguments) { SingleExpressionContext arktsArrayLiteralExprParent = new SingleExpressionContext(); ArrayLiteralExpressionContext arktsArrayLiteralExpr = new ArrayLiteralExpressionContext(arktsArrayLiteralExprParent); + arktsArrayLiteralExprParent.addChild(arktsArrayLiteralExpr).setParent(arktsArrayLiteralExprParent); ExpressionSequenceContext arktsExprSequence = new ExpressionSequenceContext(arktsArrayLiteralExpr, 0); diff --git a/migrator/src/com/ohos/migrator/apimapper/BinaryExpression.java b/migrator/src/com/ohos/migrator/apimapper/BinaryExpression.java index 8b5c00736..5156a6b86 100644 --- a/migrator/src/com/ohos/migrator/apimapper/BinaryExpression.java +++ b/migrator/src/com/ohos/migrator/apimapper/BinaryExpression.java @@ -358,6 +358,8 @@ public class BinaryExpression { arktsBinExpr.addChild(buildArktsOperandNode(operand2, arktsOrigArguments)).setParent(arktsBinExpr); assert (arktsBinExpr != null); + arktsBinExprParent.addChild(arktsBinExpr).setParent(arktsBinExprParent); + return arktsBinExprParent; } } diff --git a/migrator/src/com/ohos/migrator/apimapper/CastExpression.java b/migrator/src/com/ohos/migrator/apimapper/CastExpression.java index 9a7026d73..d495154f2 100644 --- a/migrator/src/com/ohos/migrator/apimapper/CastExpression.java +++ b/migrator/src/com/ohos/migrator/apimapper/CastExpression.java @@ -57,7 +57,7 @@ public class CastExpression { castExpression.index = Integer.valueOf(getAttribute(startElement, indexAttr)); } else if (PrimaryType.tag.equals(tag)) { - castExpression.primaryType = PrimaryType.read(xmlReader, xmlEvent); + castExpression.primaryType = PrimaryType.read(xmlReader); } else if (IntersectionType.tag.equals(tag)) { castExpression.intersectionType = IntersectionType.read(xmlReader, xmlEvent); @@ -87,8 +87,10 @@ public class CastExpression { SingleExpressionContext arktsCastExprParent = new SingleExpressionContext(); CastExpressionContext arktsCastExpr = new CastExpressionContext(arktsCastExprParent); + arktsCastExprParent.addChild(arktsCastExpr).setParent(arktsCastExprParent); - arktsCastExpr.children.add(arktsOrigArguments.get(index)); + //arktsCastExpr.children.add(arktsOrigArguments.get(index)); + arktsCastExpr.addChild(arktsOrigArguments.get(index)); arktsCastExpr.addChild(NodeBuilder.terminalNode(StaticTSParser.As)); if (primaryType != null ) { diff --git a/migrator/src/com/ohos/migrator/apimapper/Literal.java b/migrator/src/com/ohos/migrator/apimapper/Literal.java index 60598a70e..8b1309eb2 100644 --- a/migrator/src/com/ohos/migrator/apimapper/Literal.java +++ b/migrator/src/com/ohos/migrator/apimapper/Literal.java @@ -18,7 +18,7 @@ package com.ohos.migrator.apimapper; // import com.ohos.migrator.java.NodeBuilder; -import com.ohos.migrator.staticTS.parser.StaticTSParser; +import com.ohos.migrator.staticTS.parser.StaticTSParser.SingleExpressionContext; import static com.ohos.migrator.apimapper.Util.*; @@ -89,7 +89,7 @@ public class Literal { return literal; } - public StaticTSParser.SingleExpressionContext buildArktsNode() { + public SingleExpressionContext buildArktsNode() { switch (type) { case NULL: return NodeBuilder.nullLiteral(); case BOOLEAN: return NodeBuilder.boolLiteral(Boolean.parseBoolean(value)); diff --git a/migrator/src/com/ohos/migrator/apimapper/PrimaryType.java b/migrator/src/com/ohos/migrator/apimapper/PrimaryType.java index 2bb839215..b56e79e62 100644 --- a/migrator/src/com/ohos/migrator/apimapper/PrimaryType.java +++ b/migrator/src/com/ohos/migrator/apimapper/PrimaryType.java @@ -35,7 +35,7 @@ public class PrimaryType { private TypeReference typeReference = null; private ArrayType arrayType = null; - static PrimaryType read(XMLEventReader xmlReader, XMLEvent xmlPrimaryTypeEveent) throws XMLStreamException { + static PrimaryType read(XMLEventReader xmlReader) throws XMLStreamException { PrimaryType primaryType = new PrimaryType(); while (xmlReader.hasNext()) { @@ -46,7 +46,7 @@ public class PrimaryType { String tag = startElement.getName().getLocalPart(); if (tagPredefinedType.equals(tag)) { - primaryType.predefinedType = Util.getAttribute(startElement, Util.nameAttr); + primaryType.predefinedType = getAttribute(startElement, nameAttr); } else if (TypeReference.tag.equals(tag)) { primaryType.typeReference = TypeReference.read(xmlReader, xmlEvent); @@ -75,7 +75,7 @@ public class PrimaryType { public PrimaryTypeContext buildArktsNode() { PrimaryTypeContext arktsPrimaryType = new PrimaryTypeContext(null, 0); - if (!Util.isStringEmpty(predefinedType)) { + if (!isStringEmpty(predefinedType)) { arktsPrimaryType.addChild(NodeBuilder.predefinedType(predefinedType)).setParent(arktsPrimaryType); } else if (typeReference != null) { diff --git a/migrator/src/com/ohos/migrator/apimapper/TernaryExpression.java b/migrator/src/com/ohos/migrator/apimapper/TernaryExpression.java index 95c01de45..d688c6310 100644 --- a/migrator/src/com/ohos/migrator/apimapper/TernaryExpression.java +++ b/migrator/src/com/ohos/migrator/apimapper/TernaryExpression.java @@ -166,12 +166,14 @@ public class TernaryExpression { } public SingleExpressionContext buildArktsNode(List arktsOrigArguments) { SingleExpressionContext arktsTernaryExprParent = new SingleExpressionContext(); - TernaryExpressionContext arktsTernaryExpr =new TernaryExpressionContext(arktsTernaryExprParent); + TernaryExpressionContext arktsTernaryExpr = new TernaryExpressionContext(arktsTernaryExprParent); arktsTernaryExpr.addChild(buildOperandArktsNode(operand1, arktsOrigArguments)).setParent(arktsTernaryExpr); arktsTernaryExpr.addChild(buildOperandArktsNode(operand2, arktsOrigArguments)).setParent(arktsTernaryExpr); arktsTernaryExpr.addChild(buildOperandArktsNode(operand3, arktsOrigArguments)).setParent(arktsTernaryExpr); + arktsTernaryExprParent.addChild(arktsTernaryExpr).setParent(arktsTernaryExprParent); + return arktsTernaryExprParent; } } diff --git a/migrator/src/com/ohos/migrator/apimapper/UnaryExpression.java b/migrator/src/com/ohos/migrator/apimapper/UnaryExpression.java index 074e4fefd..cc2fd617e 100644 --- a/migrator/src/com/ohos/migrator/apimapper/UnaryExpression.java +++ b/migrator/src/com/ohos/migrator/apimapper/UnaryExpression.java @@ -115,7 +115,9 @@ public class UnaryExpression { arktsUnaryExpr.addChild(NodeBuilder.terminalNode(arktsOpType)); - arktsUnaryExpr.addChild((RuleContext)arktsOrigArguments.get(index)); + arktsUnaryExpr.addChild(arktsOrigArguments.get(index)); + + arktsUnaryExprParent.addChild(arktsUnaryExpr).setParent(arktsUnaryExprParent); return arktsUnaryExprParent; } diff --git a/migrator/src/com/ohos/migrator/java/JavaApiMapper.java b/migrator/src/com/ohos/migrator/java/JavaApiMapper.java index 6d2611444..b5fa50147 100644 --- a/migrator/src/com/ohos/migrator/java/JavaApiMapper.java +++ b/migrator/src/com/ohos/migrator/java/JavaApiMapper.java @@ -241,10 +241,8 @@ public class JavaApiMapper extends StaticTSParserBaseVisitor { private void substituteObject(CallExpressionContext arktsCallExpression, List arktsOrigArguments) { SingleExpressionContext arktsMethodExpression = arktsCallExpression.singleExpression(); - assert (arktsMethodExpression instanceof SingleExpressionContext); - ParseTree arktsChildNode = arktsMethodExpression.getChild(0); - assert (arktsChildNode instanceof MemberAccessExpressionContext); - MemberAccessExpressionContext arktsMemberAccessExpr = (MemberAccessExpressionContext)arktsChildNode; + assert (arktsMethodExpression.getChild(0) instanceof MemberAccessExpressionContext); + MemberAccessExpressionContext arktsMemberAccessExpr = (MemberAccessExpressionContext)arktsMethodExpression.getChild(0); SingleExpressionContext arktsOrigObject = arktsMemberAccessExpr.singleExpression(); SingleExpressionContext arktsNewObject = null; @@ -267,6 +265,19 @@ public class JavaApiMapper extends StaticTSParserBaseVisitor { } } + private void substituteType(CallExpressionContext arktsCallExpression) { + SingleExpressionContext arktsMethodExpression = arktsCallExpression.singleExpression(); + assert (arktsMethodExpression.getChild(0) instanceof MemberAccessExpressionContext); + MemberAccessExpressionContext arktsMemberAccessExpr = (MemberAccessExpressionContext)arktsMethodExpression.getChild(0); + + SingleExpressionContext arktsIdentifier = arktsMemberAccessExpr.singleExpression(); + assert (arktsIdentifier.getChildCount() == 1 && arktsIdentifier.getChild(0) instanceof IdentifierExpressionContext); + IdentifierExpressionContext arktsIdentifierExpr = (IdentifierExpressionContext)arktsIdentifier.getChild(0); + assert (arktsIdentifierExpr.getChildCount() == 1); + arktsIdentifierExpr.children.clear(); + arktsIdentifierExpr.addChild(new TerminalNodeImpl(new CommonToken(StaticTSParser.Identifier, arktsTypeName))); + } + private List getOrigArgs(CallExpressionContext arktsCallExpression) { ArgumentsContext arktsArguments = arktsCallExpression.arguments(); ExpressionSequenceContext arktsExpressionSequence = arktsArguments.expressionSequence(); @@ -291,22 +302,21 @@ public class JavaApiMapper extends StaticTSParserBaseVisitor { } public void apply(CallExpressionContext arktsCallExpression) { -// if (arktsMethodName != null) { -// assert (!arktsMethodName.isEmpty()); -// renameMethod(arktsCallExpression.singleExpression()); -// } -// List arktsOrigArguments = null; if (arguments != null || arktsObject != null) { arktsOrigArguments = getOrigArgs(arktsCallExpression); } - if (arktsTypeName != null && arktsTypeName.isEmpty()) { // Note: Here it's checked for NOT null AND empty string. + if (arktsTypeName != null) { assert (arktsObject == null); - makeMethodGlobal(arktsCallExpression); + if (arktsTypeName.isEmpty()) { // Note: Here it's checked for NOT null AND empty string. + makeMethodGlobal(arktsCallExpression); + } + else { + substituteType(arktsCallExpression); + } } else if (arktsObject != null) { - assert(arktsTypeName == null); substituteObject(arktsCallExpression, arktsOrigArguments); } @@ -536,7 +546,9 @@ public class JavaApiMapper extends StaticTSParserBaseVisitor { public void apply(MemberAccessExpressionContext arktsMemberAccessExpression) { assert arktsName != null; - arktsMemberAccessExpression.children.remove(arktsMemberAccessExpression.Identifier()); + //arktsMemberAccessExpression.children.remove(arktsMemberAccessExpression.Identifier()); + assert(arktsMemberAccessExpression.getChildCount() == 1); + arktsMemberAccessExpression.children.clear(); arktsMemberAccessExpression.addChild(new TerminalNodeImpl(new CommonToken(StaticTSParser.Identifier, arktsName))); } diff --git a/migrator/src/com/ohos/migrator/java/JavaTransformer.java b/migrator/src/com/ohos/migrator/java/JavaTransformer.java index 91037ada0..97b711207 100644 --- a/migrator/src/com/ohos/migrator/java/JavaTransformer.java +++ b/migrator/src/com/ohos/migrator/java/JavaTransformer.java @@ -3045,12 +3045,15 @@ public class JavaTransformer extends ASTVisitor implements Transformer { javaClassType = javaCtorExpr.resolveTypeBinding(); } + ITypeBinding[] javaParamsTypes = null; + if (javaCtorBinding != null) { isThrowingCall = javaCtorBinding.getExceptionTypes().length > 0; if(isThrowingCall && checkThrownExceptionSet(javaCtorInvocation)) addMultipleThrownExceptions(javaCtorBinding.getExceptionTypes()); - stsConstructorCall.javaMethodArgs = buildSignature(javaCtorBinding.getParameterTypes()); + javaParamsTypes = javaCtorBinding.getParameterTypes(); + stsConstructorCall.javaMethodArgs = buildSignature(javaParamsTypes); if (javaCtorExpr == null) { javaClassType = javaCtorBinding.getDeclaringClass(); @@ -3081,7 +3084,7 @@ public class JavaTransformer extends ASTVisitor implements Transformer { translateTypeArguments(javaTypeArgs); stsConstructorCall.javaMethodTypeArgs = buildSignature(javaTypeArgs); - translateArguments(javaArgs); + translateArguments(javaArgs, javaParamsTypes); popCurrent(); // ConstructorCallContext @@ -3110,7 +3113,41 @@ public class JavaTransformer extends ASTVisitor implements Transformer { return false; } - private List translateArguments(List javaArgs) { +// private List translateArguments(List javaArgs) { +// pushCurrent(new ArgumentsContext(stsCurrent, 0)); +// +// List result = null; +// if (javaArgs != null && !javaArgs.isEmpty()) { +// ExpressionSequenceContext stsExprSeq = new ExpressionSequenceContext(stsCurrent, 0); +// pushCurrent(stsExprSeq); +// +// for (Expression javaExpr : javaArgs) { +// ITypeBinding javaTypeBinding = javaExpr.resolveTypeBinding(); +// if (javaTypeBinding != null) { +// sbForApiMapper.append(javaTypeBinding.getQualifiedName()); +// } +// else { +// reportError("Fail to resolve argument", javaExpr); +// } +// +// sbForApiMapper.append(','); +// +// javaExpr.accept(this); +// } +// +// if (sbForApiMapper.length() > 1) { +// sbForApiMapper.setLength(sbForApiMapper.length() - 1); // Remove the ending extra comma. +// } +// +// popCurrent(); // ExpressionSequenceContext +// result = stsExprSeq.singleExpression(); +// } +// +// popCurrent(); // ArgumentsContext +// return result; +// } + + private List translateArguments(List javaArgs, ITypeBinding[] javaParamsTypes) { pushCurrent(new ArgumentsContext(stsCurrent, 0)); List result = null; @@ -3118,22 +3155,43 @@ public class JavaTransformer extends ASTVisitor implements Transformer { ExpressionSequenceContext stsExprSeq = new ExpressionSequenceContext(stsCurrent, 0); pushCurrent(stsExprSeq); - for (Expression javaExpr : javaArgs) { + int nargs = javaArgs.size(); + int n = nargs; + // For the case of vararg the number of actual arguments may be more than the list of formal parameters. + // In such case the last format parameter has to have type of an array. + if (javaParamsTypes != null && javaParamsTypes.length < nargs) { + // The last parameter should be of array type to which all ending extra arguments will be packed. + n = javaParamsTypes.length - 1; + assert (javaParamsTypes[n].isArray()) : "For vararg functions the last parameter has to be an array."; + } + + for (int i = 0; i < n; i++) { + Expression javaExpr = javaArgs.get(i); + ITypeBinding javaTypeBinding = javaExpr.resolveTypeBinding(); - if (javaTypeBinding != null) { - sbForApiMapper.append(javaTypeBinding.getQualifiedName()); - } - else { + if (javaTypeBinding == null) { reportError("Fail to resolve argument", javaExpr); } - sbForApiMapper.append(','); - javaExpr.accept(this); } - if (sbForApiMapper.length() > 1) { - sbForApiMapper.setLength(sbForApiMapper.length() - 1); // Remove the ending extra comma. + if (n < nargs) { + pushCurrent(new ArrayLiteralExpressionContext(pushSingleExpression())); + pushCurrent(new ExpressionSequenceContext(stsCurrent, 0)); + + for (int i = n; i < nargs; i++) { + Expression javaExpr = javaArgs.get(i); + javaExpr.accept(this); + + ITypeBinding javaTypeBinding = javaExpr.resolveTypeBinding(); + if (javaTypeBinding == null) { + reportError("Fail to resolve argument", javaExpr); + } + } + + popCurrent(); // ExpressionSequenceContext + popSingleExpression(); // ArrayLiteralContext } popCurrent(); // ExpressionSequenceContext @@ -3389,12 +3447,15 @@ public class JavaTransformer extends ASTVisitor implements Transformer { reportError("Fail to resolve class type", javaClassType); } - List stsArgs = translateArguments(javaClassInstanceCreation.arguments()); + ITypeBinding[] javaParamsTypes = null; if (javaCtorBinding != null) { - stsNewClassInstanceExpr.javaMethodArgs = buildSignature(javaCtorBinding.getParameterTypes()); + javaParamsTypes = javaCtorBinding.getParameterTypes(); + stsNewClassInstanceExpr.javaMethodArgs = buildSignature(javaParamsTypes); } + List stsArgs = translateArguments(javaClassInstanceCreation.arguments(), javaParamsTypes); + AnonymousClassDeclaration javaAnonymousClassDeclaration = javaClassInstanceCreation.getAnonymousClassDeclaration(); if (javaAnonymousClassDeclaration != null) { @@ -3784,12 +3845,15 @@ public class JavaTransformer extends ASTVisitor implements Transformer { translateTypeArguments(javaMethodInvocation.typeArguments()); stsCallExpression.javaMethodTypeArgs = buildSignature(javaMethodInvocation.typeArguments()); - translateArguments(javaMethodInvocation.arguments()); + ITypeBinding[] javaParamsTypes = null; if (javaMethodBinding != null) { - stsCallExpression.javaMethodArgs = buildSignature(javaMethodBinding.getParameterTypes()); + javaParamsTypes = javaMethodBinding.getParameterTypes(); + stsCallExpression.javaMethodArgs = buildSignature(javaParamsTypes); } + translateArguments(javaMethodInvocation.arguments(), javaParamsTypes); + popSingleExpression(); // CallExpressionContext if (isThrowingCall) { @@ -3863,11 +3927,14 @@ public class JavaTransformer extends ASTVisitor implements Transformer { translateTypeArguments(javaSuperMethodInvocation.typeArguments()); stsCallExpression.javaTypeArgs = buildSignature(javaSuperMethodInvocation.typeArguments()); + ITypeBinding[] javaParamsTypes = null; + if (javaMethodBinding != null) { - stsCallExpression.javaMethodArgs = buildSignature(javaMethodBinding.getParameterTypes()); + javaParamsTypes = javaMethodBinding.getParameterTypes(); + stsCallExpression.javaMethodArgs = buildSignature(javaParamsTypes); } - translateArguments(javaSuperMethodInvocation.arguments()); + translateArguments(javaSuperMethodInvocation.arguments(), javaParamsTypes); popSingleExpression(); // CallExpressionContext diff --git a/migrator/test/java-mapper/CallExpressionRulesString.java b/migrator/test/java-mapper/CallExpressionRulesString.java new file mode 100644 index 000000000..e590bc8ce --- /dev/null +++ b/migrator/test/java-mapper/CallExpressionRulesString.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ohos.migrator.test.java; + +import java.util.List; +import java.util.ArrayList; + +class CallExpressiontRulesString { + public static void Test() { + String s1 = new String("abc"); + boolean b = s1.contains("d"); + +// List l = new ArrayList<>(2); +// l.add("a"); +// l.add("b"); + +// List strs = l; +// +// String s2 = String.join("+", strs); + + String s3 = String.join("+", "a", "b", "c"); + + String sc = String.valueOf('c'); + String si = String.valueOf(1); + String sl = String.valueOf(2l); + String sf = String.valueOf(3.f); + String sd = String.valueOf(4.); + } +} \ No newline at end of file diff --git a/migrator/test/java-mapper/CallExpressionRulesString.java.sts b/migrator/test/java-mapper/CallExpressionRulesString.java.sts new file mode 100644 index 000000000..96b6a5d29 --- /dev/null +++ b/migrator/test/java-mapper/CallExpressionRulesString.java.sts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ohos.migrator.test.java; + +import * from "std/math/math"; +import List from "java/util"; +import ArrayList from "java/util"; +open class CallExpressiontRulesString { + public static Test(): void { + let s1 : String = new String("abc"); + let b : boolean = s1.contains("d", 0); +// List l = new ArrayList<>(2); +// l.add("a"); +// l.add("b"); +// List strs = l; +// +// String s2 = String.join("+", strs); + let s3 : String = String.join(["a", "b", "c"], "+"); + let sc : String = StringBuilder.toString('c'); + let si : String = StringBuilder.toString(1); + let sl : String = StringBuilder.toString(2 as long); + let sf : String = StringBuilder.toString(3. as float); + let sd : String = StringBuilder.toString(4.); + } +} + -- Gitee From 2bec8ea6d537d01d8dff100ee2938040ebe28c4f Mon Sep 17 00:00:00 2001 From: Alexander Pavlyuk Date: Thu, 15 Dec 2022 17:44:06 +0300 Subject: [PATCH 02/13] CallExpressionRule bugs related to java.lang.Character class are fixed. Change-Id: I1e90e111ce19866dc89dfb87c1f4e1d4a48dac31 Signed-off-by: Alexander Pavlyuk --- migrator/config/java-api-mapper.xml | 298 ++++++++++++------ .../Java_API_to_ArkTS_API_mapping_rules.docx | Bin 14731 -> 15030 bytes migrator/docs/java-api-list.xml | 36 +-- .../migrator/apimapper/TypeReference.java | 9 +- .../src/com/ohos/migrator/apimapper/Util.java | 1 + .../com/ohos/migrator/java/JavaApiMapper.java | 41 ++- .../ohos/migrator/java/JavaTransformer.java | 6 +- .../java-mapper/CallExpressionRulesByte.java | 28 ++ .../CallExpressionRulesByte.java.sts | 27 ++ .../CallExpressionRulesCharacter.java | 45 +++ .../CallExpressionRulesCharacter.java.sts | 39 +++ 11 files changed, 408 insertions(+), 122 deletions(-) create mode 100644 migrator/test/java-mapper/CallExpressionRulesByte.java create mode 100644 migrator/test/java-mapper/CallExpressionRulesByte.java.sts create mode 100644 migrator/test/java-mapper/CallExpressionRulesCharacter.java create mode 100644 migrator/test/java-mapper/CallExpressionRulesCharacter.java.sts diff --git a/migrator/config/java-api-mapper.xml b/migrator/config/java-api-mapper.xml index 122e901f5..964748e07 100644 --- a/migrator/config/java-api-mapper.xml +++ b/migrator/config/java-api-mapper.xml @@ -55,7 +55,7 @@ - + @@ -65,7 +65,7 @@ - + @@ -199,7 +199,7 @@ --> - + @@ -209,7 +209,7 @@ - + @@ -225,7 +225,7 @@ --> - + @@ -243,7 +243,7 @@ --> - + @@ -258,20 +258,37 @@ - + + + + + + + + + + + + + + + - @@ -283,7 +300,7 @@ --> - + @@ -293,7 +310,7 @@ - + @@ -303,57 +320,169 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - + + + + + + + + + + + @@ -366,7 +495,7 @@ --> - + @@ -376,7 +505,7 @@ - + @@ -394,7 +523,7 @@ --> - + @@ -404,7 +533,7 @@ - + @@ -420,7 +549,7 @@ --> - + @@ -439,7 +568,7 @@ --> - + @@ -460,7 +589,7 @@ --> - + @@ -470,7 +599,7 @@ - + @@ -486,7 +615,7 @@ --> - + @@ -505,7 +634,7 @@ --> - + @@ -526,7 +655,7 @@ --> - + @@ -536,7 +665,7 @@ - + @@ -552,7 +681,7 @@ --> - + @@ -571,7 +700,7 @@ --> - + @@ -592,7 +721,7 @@ --> - + @@ -602,7 +731,7 @@ - + @@ -618,7 +747,7 @@ --> - + @@ -637,7 +766,7 @@ --> - + @@ -760,15 +889,15 @@ - + - + - + @@ -777,48 +906,41 @@ - - - - - + + + + + + + + + + + + + + + - - + + + + + + - - - - - - - - - - - - - - - - diff --git a/migrator/docs/Java_API_to_ArkTS_API_mapping_rules.docx b/migrator/docs/Java_API_to_ArkTS_API_mapping_rules.docx index e6f1302a6ebbe47c18bb9844ff916d6052d4cf3f..792dbc5959dbc45c10b9692309c6b4e847c7e4bf 100644 GIT binary patch delta 11850 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 X{|xqTC;o3kn<*x|lrTr!f7SjEWaNhN delta 11573 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 HU(NpkPTS?` diff --git a/migrator/docs/java-api-list.xml b/migrator/docs/java-api-list.xml index a312142e7..ce3cb0dd1 100644 --- a/migrator/docs/java-api-list.xml +++ b/migrator/docs/java-api-list.xml @@ -149,7 +149,7 @@ boolean equals(Object obj) ArkTS: the same float floatValue() ArkTS: the same int hashCode() ArkTS: the same - static int hashCode(byte value) + static int hashCode(byte value) ArkTS: new Byte(value).hasCode() int intValue() ArkTS: the same long longValue() ArkTS: the same static byte parseByte(String s) @@ -233,7 +233,7 @@ static byte UNASSIGNED static byte UPPERCASE_LETTER - Character(char value) ArkTS: the same + Character(char value) ArkTS: Char(char value) static int charCount(int codePoint) char charValue() static int codePointAt(char[] a, int index) @@ -258,15 +258,15 @@ static int getType(char ch) static int getType(int codePoint) int hashCode() ArkTS: the same - static int hashCode(char value) ArkTS: the same - static char highSurrogate(int codePoint) ArkTS: static getHighSurrogate(value: int): char + static int hashCode(char value) ArkTS: the same function name but the type is renamed + static char highSurrogate(int codePoint) ArkTS: static getHighSurrogate(codePoint: int): char static boolean isAlphabetic(int codePoint) static boolean isBmpCodePoint(int codePoint) static boolean isDefined(char ch) static boolean isDefined(int codePoint) - static boolean isDigit(char ch) ArkTS: static isDecDigit(value: char): boolean + static boolean isDigit(char ch) ArkTS: the same function name but the type is renamed static boolean isDigit(int codePoint) - static boolean isHighSurrogate(char ch) ArkTS: the same + static boolean isHighSurrogate(char ch) ArkTS: the same function name but the type is renamed static boolean isIdentifierIgnorable(char ch) static boolean isIdentifierIgnorable(int codePoint) static boolean isIdeographic(int codePoint) @@ -278,13 +278,13 @@ static boolean isJavaIdentifierStart(int codePoint) static boolean isJavaLetter(char ch) static boolean isJavaLetterOrDigit(char ch) - static boolean isLetter(char ch) - static boolean isLetter(int codePoint) ArkTS: the same + static boolean isLetter(char ch) ArkTS: the same function but the type is renamed + static boolean isLetter(int codePoint) static boolean isLetterOrDigit(char ch) static boolean isLetterOrDigit(int codePoint) - static boolean isLowerCase(char ch) ArkTS: the same + static boolean isLowerCase(char ch) ArkTS: the same function but the type is renamed static boolean isLowerCase(int codePoint) - static boolean isLowSurrogate(char ch) ArkTS: the same + static boolean isLowSurrogate(char ch) ArkTS: the same function but the type is renamed static boolean isMirrored(char ch) static boolean isMirrored(int codePoint) static boolean isSpace(char ch) @@ -299,27 +299,27 @@ static boolean isUnicodeIdentifierPart(int codePoint) static boolean isUnicodeIdentifierStart(char ch) static boolean isUnicodeIdentifierStart(int codePoint) - static boolean isUpperCase(char ch) ArkTS: the same + static boolean isUpperCase(char ch) ArkTS: the same function but the type is renamed static boolean isUpperCase(int codePoint) static boolean isValidCodePoint(int codePoint) - static boolean isWhitespace(char ch) ArkTS: the same + static boolean isWhitespace(char ch) ArkTS: the same function but the type is renamed static boolean isWhitespace(int codePoint) - static char lowSurrogate(int codePoint) ArkTS: static getLowSurrogate(value: int): char + static char lowSurrogate(int codePoint) ArkTS: static getLowSurrogate(codePoint: int): char static int offsetByCodePoints(char[] a, int start, int count, int index, int codePointOffset) static int offsetByCodePoints(CharSequence seq, int index, int codePointOffset) static char reverseBytes(char ch) static char[] toChars(int codePoint) static int toChars(int codePoint, char[] dst, int dstIndex) static int toCodePoint(char high, char low) - static char toLowerCase(char ch) ArkTS: the same + static char toLowerCase(char ch) ArkTS: the same function but the type is renamed static int toLowerCase(int codePoint) - String toString() - static String toString(char c) + String toString() ArkTS: the same + static String toString(char c) ArkTS: new Char(c).toString(); static char toTitleCase(char ch) static int toTitleCase(int codePoint) - static char toUpperCase(char ch) ArkTS: the same + static char toUpperCase(char ch) ArkTS: the same function but the type is renamed static int toUpperCase(int codePoint) - static Character valueOf(char c) ArkTS: the same + static Character valueOf(char c) ArkTS: the same function but the type is renamed java.lang.Character.Subset java.lang.Character.UnicodeBlock diff --git a/migrator/src/com/ohos/migrator/apimapper/TypeReference.java b/migrator/src/com/ohos/migrator/apimapper/TypeReference.java index 7c96ecfec..05f59cb1f 100644 --- a/migrator/src/com/ohos/migrator/apimapper/TypeReference.java +++ b/migrator/src/com/ohos/migrator/apimapper/TypeReference.java @@ -18,6 +18,7 @@ package com.ohos.migrator.apimapper; import com.ohos.migrator.java.NodeBuilder; import com.ohos.migrator.staticTS.parser.StaticTSParser.TypeReferenceContext; import com.ohos.migrator.staticTS.parser.StaticTSParser.TypeArgumentContext; +import static com.ohos.migrator.apimapper.Util.*; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLStreamException; @@ -35,11 +36,11 @@ import java.util.List; // public class TypeReference { static public String tag = "TypeReference"; - private String arktsName = null; + private String arktsTypeName = null; private TypeArguments typeArguments = null; public String getArktsName() { - return arktsName; + return arktsTypeName; } static public TypeReference read(XMLEventReader xmlReader, XMLEvent xmlTypeReferenceEvent) throws XMLStreamException { @@ -47,7 +48,7 @@ public class TypeReference { assert xmlTypeReferenceEvent.isStartElement(); StartElement startElement = xmlTypeReferenceEvent.asStartElement(); - typeReference.arktsName = Util.getAttribute(startElement, Util.arktsNameAttr); + typeReference.arktsTypeName = getAttribute(startElement, arktsTypeNameAttr); while (xmlReader.hasNext()) { XMLEvent xmlEvent = xmlReader.nextEvent(); @@ -79,7 +80,7 @@ public class TypeReference { } public TypeReferenceContext buildArktsNode(List arktsOrigTypeArguments) { - TypeReferenceContext arktsTypeReference = NodeBuilder.typeReference(arktsName); + TypeReferenceContext arktsTypeReference = NodeBuilder.typeReference(arktsTypeName); if (typeArguments != null) { arktsTypeReference.addChild(typeArguments.buildArktsNode(arktsOrigTypeArguments)).setParent(arktsTypeReference); diff --git a/migrator/src/com/ohos/migrator/apimapper/Util.java b/migrator/src/com/ohos/migrator/apimapper/Util.java index 60fa7be25..e266d757c 100644 --- a/migrator/src/com/ohos/migrator/apimapper/Util.java +++ b/migrator/src/com/ohos/migrator/apimapper/Util.java @@ -36,6 +36,7 @@ public class Util { static public QName javaMethodArgsAttr = new QName("javaMethodArgs"); static public QName javaImportAttr = new QName("javaImport"); static public QName arktsNameAttr = new QName("arktsName"); + static public QName arktsTypeNameAttr = new QName("arktsTypeName"); static public QName arktsItemAttr = new QName("arktsItem"); static public QName arktsAliasAttr = new QName("arktsAlias"); static public QName arktsFromAttr = new QName("arktsFrom"); diff --git a/migrator/src/com/ohos/migrator/java/JavaApiMapper.java b/migrator/src/com/ohos/migrator/java/JavaApiMapper.java index b5fa50147..aa543e34d 100644 --- a/migrator/src/com/ohos/migrator/java/JavaApiMapper.java +++ b/migrator/src/com/ohos/migrator/java/JavaApiMapper.java @@ -540,16 +540,22 @@ public class JavaApiMapper extends StaticTSParserBaseVisitor { static public String tag = "MemberAccessExpressionRule"; private String arktsName = null; + private TypeReference typeReference = null; // Optional ArkTS type for a static field access. // ArkTS: // | singleExpression Dot Identifier # MemberAccessExpression public void apply(MemberAccessExpressionContext arktsMemberAccessExpression) { assert arktsName != null; - //arktsMemberAccessExpression.children.remove(arktsMemberAccessExpression.Identifier()); - assert(arktsMemberAccessExpression.getChildCount() == 1); - arktsMemberAccessExpression.children.clear(); + arktsMemberAccessExpression.children.remove(arktsMemberAccessExpression.Identifier()); +// assert(arktsMemberAccessExpression.getChildCount() == 1); +// arktsMemberAccessExpression.children.clear(); arktsMemberAccessExpression.addChild(new TerminalNodeImpl(new CommonToken(StaticTSParser.Identifier, arktsName))); + + if (typeReference != null) { + arktsMemberAccessExpression.children.remove(arktsMemberAccessExpression.singleExpression()); + arktsMemberAccessExpression.addChild(typeReference.buildArktsNode(null)); + } } static private String signature(String javaObjectType, String javaName) { @@ -578,17 +584,30 @@ public class JavaApiMapper extends StaticTSParserBaseVisitor { return signature(javaObjectType, javaName); } - static MemberAccessExpressionRule read(XMLEventReader xmlReader, XMLEvent xmlMemberAccessExpressionEvent, StartElement ruleStartElement) throws XMLStreamException { + static MemberAccessExpressionRule read(XMLEventReader xmlReader, StartElement ruleStartElement) throws XMLStreamException { MemberAccessExpressionRule memberAccessExpressionRule = new MemberAccessExpressionRule(); memberAccessExpressionRule.arktsName = getAttribute(ruleStartElement, arktsNameAttr); - // Read the end event () - assert (xmlReader.hasNext()); - XMLEvent xmlEvent = xmlReader.nextEvent(); - assert (xmlEvent.isEndElement()); - EndElement endElement = xmlEvent.asEndElement(); - assert (tag.equals(endElement.getName().getLocalPart())); + // Read an optional element and the end event () + while (xmlReader.hasNext()) { + XMLEvent xmlEvent = xmlReader.nextEvent(); + + if (xmlEvent.isStartElement()) { + StartElement startElement = xmlEvent.asStartElement(); + String tag = startElement.getName().getLocalPart(); + + if (TypeReference.tag.equals(tag)) { + memberAccessExpressionRule.typeReference = TypeReference.read(xmlReader, xmlEvent); + } + else assert false; + } + else if (xmlEvent.isEndElement()) { + EndElement endElement = xmlEvent.asEndElement(); + assert MemberAccessExpressionRule.tag.equals(endElement.getName().getLocalPart()); + break; + } + } return memberAccessExpressionRule; } @@ -946,7 +965,7 @@ public class JavaApiMapper extends StaticTSParserBaseVisitor { } else if (MemberAccessExpressionRule.tag.equals(tag)) { String signature = MemberAccessExpressionRule.signature(startElement); - MemberAccessExpressionRule rule = MemberAccessExpressionRule.read(xmlReader, xmlEvent, startElement); + MemberAccessExpressionRule rule = MemberAccessExpressionRule.read(xmlReader, startElement); assert !isStringEmpty(signature) && rule != null; memberAccessExpressionRules.put(signature, rule); diff --git a/migrator/src/com/ohos/migrator/java/JavaTransformer.java b/migrator/src/com/ohos/migrator/java/JavaTransformer.java index 97b711207..b70a5e4b7 100644 --- a/migrator/src/com/ohos/migrator/java/JavaTransformer.java +++ b/migrator/src/com/ohos/migrator/java/JavaTransformer.java @@ -1527,6 +1527,10 @@ public class JavaTransformer extends ASTVisitor implements Transformer { // singleExpression: | Identifier # IdentifierExpression @Override public boolean visit(QualifiedName javaQualifiedName) { + // TODO: Check if this javaQualifiedName referes to a calss static field access. Like: Character.MAX_HIGH_SURROGATE. + // In this case it has to be translated to a MemberAccessExpression and not to a simple Identifier. + // It's needed to let the ApiMapper to apply corresponding MemberAccessExpressionRule. + // See #272 String name = javaQualifiedName.getFullyQualifiedName(); stsCurrent.addChild(NodeBuilder.identifierExpression(name)).setParent(stsCurrent); // Don't count names as transformed as most of them are transformed manually. @@ -3384,7 +3388,7 @@ public class JavaTransformer extends ASTVisitor implements Transformer { // AnonymousClassDeclaration: { ClassBodyDeclaration } // STS tree: // singleExpression: - // | New (singleExpression Dot)? typeReference arguments? classBody? # NewClassExpression + // | New typeArguments? typeReference arguments? classBody? # NewClassInstanceExpression // arguments: OpenParen expressionSequence? CloseParen // classBody: OpenBrace classMember* clinit=classInitializer? classMember* CloseBrace // NOTE: If ctor called by class instance creation expression can throw exceptions, diff --git a/migrator/test/java-mapper/CallExpressionRulesByte.java b/migrator/test/java-mapper/CallExpressionRulesByte.java new file mode 100644 index 000000000..14b6b2c82 --- /dev/null +++ b/migrator/test/java-mapper/CallExpressionRulesByte.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ohos.migrator.test.java; + +class CallExpressiontRulesByte { + public static void Test() { + byte v1 = 3; + byte v2 = 4; + int res = Byte.compare(v1, v2); + + int hesh = Byte.hashCode((byte)3); + + String s = Byte.toString((byte)8); + } +} \ No newline at end of file diff --git a/migrator/test/java-mapper/CallExpressionRulesByte.java.sts b/migrator/test/java-mapper/CallExpressionRulesByte.java.sts new file mode 100644 index 000000000..f8e9f6557 --- /dev/null +++ b/migrator/test/java-mapper/CallExpressionRulesByte.java.sts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ohos.migrator.test.java; + +import * from "std/math/math"; +open class CallExpressiontRulesByte { + public static Test(): void { + let v1 : byte = 3; + let v2 : byte = 4; + let res : int = new Byte(v1).compareTo(new Byte(v2)); + let hesh : int = Byte.hashCode(3 as byte); + let s : String = new Byte(8 as byte).toString(); + } +} + diff --git a/migrator/test/java-mapper/CallExpressionRulesCharacter.java b/migrator/test/java-mapper/CallExpressionRulesCharacter.java new file mode 100644 index 000000000..65010899a --- /dev/null +++ b/migrator/test/java-mapper/CallExpressionRulesCharacter.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ohos.migrator.test.java; + +class CallExpressiontRulesCharacter { + public static void Test() { + Character c = new Character('g'); + + int res = Character.compare('c', 'b'); + + int hash = Character.hashCode('3'); + + c = Character.highSurrogate(386); + c = Character.lowSurrogate(386); + + boolean b; + b = Character.isDigit('8'); + b = Character.isHighSurrogate('c'); + b = Character.isLetter('8'); + b = Character.isLowerCase('8'); + b = Character.isLowSurrogate('8'); + b = Character.isUpperCase('8'); + b = Character.isWhitespace('8'); + + c = Character.toLowerCase('C'); + c = Character.toUpperCase('a'); + + Character ch = Character.valueOf('d'); + + String s = Character.toString('s'); + } +} \ No newline at end of file diff --git a/migrator/test/java-mapper/CallExpressionRulesCharacter.java.sts b/migrator/test/java-mapper/CallExpressionRulesCharacter.java.sts new file mode 100644 index 000000000..b91955faf --- /dev/null +++ b/migrator/test/java-mapper/CallExpressionRulesCharacter.java.sts @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ohos.migrator.test.java; + +import * from "std/math/math"; +open class CallExpressiontRulesCharacter { + public static Test(): void { + let c : Char = new Char('g'); + let res : int = new Char('c').compareTo(new Char('b')); + let hash : int = Char.hashCode('3'); + c = Char.getHighSurrogate(386); + c = Char.getLowSurrogate(386); + let b : boolean ; + b = Char.isDecDigit('8'); + b = Char.isHighSurrogate('c'); + b = Char.isLetter('8'); + b = Char.isLowerCase('8'); + b = Char.isLowSurrogate('8'); + b = Char.isUpperCase('8'); + b = Char.isWhitespace('8'); + c = Char.toLowerCase('C'); + c = Char.toUpperCase('a'); + let ch : Char = Char.valueOf('d'); + let s : String = new Char('s').toString(); + } +} + -- Gitee From 8a6ec14445afa60c2def4debfe63393676d049ab Mon Sep 17 00:00:00 2001 From: Csaba Osztrogonac Date: Tue, 6 Dec 2022 10:25:11 +0100 Subject: [PATCH 03/13] [ets] Implement compiling sequence expression Signed-off-by: Csaba Osztrogonac --- ir/expressions/sequenceExpression.cpp | 12 +++++++++- ir/expressions/sequenceExpression.h | 3 ++- test/runtime/ets/for-statement.ets | 33 +++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 test/runtime/ets/for-statement.ets diff --git a/ir/expressions/sequenceExpression.cpp b/ir/expressions/sequenceExpression.cpp index a763309d4..8629be59e 100644 --- a/ir/expressions/sequenceExpression.cpp +++ b/ir/expressions/sequenceExpression.cpp @@ -38,14 +38,24 @@ void SequenceExpression::Compile([[maybe_unused]] compiler::PandaGen *pg) const } } +void SequenceExpression::Compile(compiler::ETSGen *etsg) const +{ + for (const auto *it : sequence_) { + it->Compile(etsg); + } +} + checker::Type *SequenceExpression::Check([[maybe_unused]] checker::TSChecker *checker) { // TODO(aszilagyi) return checker->GlobalAnyType(); } -checker::Type *SequenceExpression::Check([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *SequenceExpression::Check(checker::ETSChecker *checker) { + for (auto *it : sequence_) { + it->Check(checker); + } return nullptr; } } // namespace panda::es2panda::ir diff --git a/ir/expressions/sequenceExpression.h b/ir/expressions/sequenceExpression.h index 386321e13..b3bd90204 100644 --- a/ir/expressions/sequenceExpression.h +++ b/ir/expressions/sequenceExpression.h @@ -38,8 +38,9 @@ public: void Iterate(const NodeTraverser &cb) const override; void Dump(ir::AstDumper *dumper) const override; void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; + void Compile(compiler::ETSGen *etsg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; - checker::Type *Check([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *Check(checker::ETSChecker *checker) override; private: ArenaVector sequence_; diff --git a/test/runtime/ets/for-statement.ets b/test/runtime/ets/for-statement.ets new file mode 100644 index 000000000..2ab9767fa --- /dev/null +++ b/test/runtime/ets/for-statement.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function main(): void { + let a : int = 0; + let b : int = 0; + + for (let aa : int = 1, bb : int = 1; aa<5 && bb<5; aa++, bb++) { + a += aa; + b += bb; + } + assert (a == 10 && b == 10) + + let aa : int = 10; + let bb : int = 10; + for (aa = 1, bb = 1; aa<5 && bb<5; aa++, bb++) { + a += aa; + b += bb; + } + assert (a == 20 && b == 20) +} -- Gitee From 9058386d605f498cd780e90914d2faa37875d314 Mon Sep 17 00:00:00 2001 From: Kalman Toth Date: Mon, 14 Nov 2022 17:43:33 +0100 Subject: [PATCH 04/13] Generic type variance parsing support Signed-off-by: Kalman Toth --- binder/ETSBinder.cpp | 6 +- ir/astNode.h | 12 + ir/ets/etsWildcardType.cpp | 13 +- ir/ets/etsWildcardType.h | 34 +- ir/expression.h | 1 + ir/ts/tsTypeParameter.cpp | 2 + ir/ts/tsTypeParameter.h | 9 + ir/typeNode.h | 1 + lexer/scripts/keywords.yaml | 7 +- lexer/token/token.cpp | 2 + lexer/token/tokenType.h | 1 + parser/ASparser.cpp | 6 +- parser/ETSparser.cpp | 120 +- parser/ETSparser.h | 2 + parser/TSparser.cpp | 15 +- parser/TypedParser.cpp | 28 +- parser/TypedParser.h | 2 +- parser/parserImpl.h | 3 +- test/parser/ets/type_variance1-expected.txt | 3331 +++++++++++++++++++ test/parser/ets/type_variance1.ets | 45 + test/parser/ets/type_variance2-expected.txt | 1 + test/parser/ets/type_variance2.ets | 18 + test/parser/ets/type_variance3-expected.txt | 1 + test/parser/ets/type_variance3.ets | 18 + test/parser/ets/type_variance4-expected.txt | 1 + test/parser/ets/type_variance4.ets | 18 + 26 files changed, 3587 insertions(+), 110 deletions(-) create mode 100644 test/parser/ets/type_variance1-expected.txt create mode 100644 test/parser/ets/type_variance1.ets create mode 100644 test/parser/ets/type_variance2-expected.txt create mode 100644 test/parser/ets/type_variance2.ets create mode 100644 test/parser/ets/type_variance3-expected.txt create mode 100644 test/parser/ets/type_variance3.ets create mode 100644 test/parser/ets/type_variance4-expected.txt create mode 100644 test/parser/ets/type_variance4.ets diff --git a/binder/ETSBinder.cpp b/binder/ETSBinder.cpp index 4f836b128..5e1d1bd50 100644 --- a/binder/ETSBinder.cpp +++ b/binder/ETSBinder.cpp @@ -83,11 +83,7 @@ void ETSBinder::LookupTypeArgumentReferences(ir::ETSTypeReference *typeRef) } for (auto *it : iter->TypeParams()->Params()) { - if (!it->IsETSTypeReference()) { - continue; - } - - ResolveReference(it); + ResolveReferences(it); } iter = iter->Previous(); diff --git a/ir/astNode.h b/ir/astNode.h index c16c5497b..f87f7e96f 100644 --- a/ir/astNode.h +++ b/ir/astNode.h @@ -82,6 +82,8 @@ enum class ModifierFlags : uint32_t { CONSTRUCTOR = 1U << 14U, SYNCHRONIZED = 1U << 15U, FUNCTIONAL = 1U << 16U, + IN = 1U << 17U, + OUT = 1U << 18U, ACCESS = PUBLIC | PROTECTED | PRIVATE, ALL = STATIC | ASYNC | ACCESS | DECLARE | READONLY | ABSTRACT, ALLOWED_IN_CTOR_PARAMETER = ACCESS | READONLY, @@ -387,6 +389,16 @@ public: return (flags_ & ModifierFlags::DECLARE) != 0; } + bool IsIn() const + { + return (flags_ & ModifierFlags::IN) != 0; + } + + bool IsOut() const + { + return (flags_ & ModifierFlags::OUT) != 0; + } + void AddModifier(ModifierFlags flags) { flags_ |= flags; diff --git a/ir/ets/etsWildcardType.cpp b/ir/ets/etsWildcardType.cpp index 2912d0d23..500c167cc 100644 --- a/ir/ets/etsWildcardType.cpp +++ b/ir/ets/etsWildcardType.cpp @@ -24,20 +24,17 @@ namespace panda::es2panda::ir { void ETSWildcardType::Iterate([[maybe_unused]] const NodeTraverser &cb) const { - if (extendsBound_ != nullptr) { - cb(extendsBound_); - } - - if (superBound_ != nullptr) { - cb(superBound_); + if (typeReference_ != nullptr) { + cb(typeReference_); } } void ETSWildcardType::Dump(ir::AstDumper *dumper) const { dumper->Add({{"type", "ETSWildcardType"}, - {"superBound", AstDumper::Optional(superBound_)}, - {"extendsBound", AstDumper::Optional(extendsBound_)}}); + {"typeReference", AstDumper::Optional(typeReference_)}, + {"in", AstDumper::Optional(IsIn())}, + {"out", AstDumper::Optional(IsOut())}}); } void ETSWildcardType::Compile([[maybe_unused]] compiler::PandaGen *pg) const {} diff --git a/ir/ets/etsWildcardType.h b/ir/ets/etsWildcardType.h index 7a8c9c90b..0f1588ed8 100644 --- a/ir/ets/etsWildcardType.h +++ b/ir/ets/etsWildcardType.h @@ -22,36 +22,15 @@ namespace panda::es2panda::ir { class ETSWildcardType : public TypeNode { public: - explicit ETSWildcardType() : TypeNode(AstNodeType::ETS_WILDCARD_TYPE) {} - - void SetExtendsBound(ir::ETSTypeReference *bound) - { - extendsBound_ = bound; - } - - const ir::ETSTypeReference *ExtendsBound() const - { - return extendsBound_; - } - - ir::ETSTypeReference *ExtendsBound() - { - return extendsBound_; - } - - void SetSuperBound(ir::ETSTypeReference *bound) - { - superBound_ = bound; - } - - const ir::ETSTypeReference *SuperBound() const + explicit ETSWildcardType(ir::ETSTypeReference *typeReference, ModifierFlags flags) + : TypeNode(AstNodeType::ETS_WILDCARD_TYPE, flags), typeReference_(typeReference) { - return superBound_; + ASSERT((flags == ModifierFlags::IN && typeReference != nullptr) || flags == ModifierFlags::OUT); } - ir::ETSTypeReference *SuperBound() + ir::ETSTypeReference *TypeReference() { - return superBound_; + return typeReference_; } void Iterate(const NodeTraverser &cb) const override; @@ -64,8 +43,7 @@ public: checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; private: - ir::ETSTypeReference *extendsBound_ {}; - ir::ETSTypeReference *superBound_ {}; + ir::ETSTypeReference *typeReference_ {}; }; } // namespace panda::es2panda::ir diff --git a/ir/expression.h b/ir/expression.h index b9a56eadd..abc899701 100644 --- a/ir/expression.h +++ b/ir/expression.h @@ -93,6 +93,7 @@ public: protected: explicit Expression(AstNodeType type) : TypedAstNode(type) {} + explicit Expression(AstNodeType type, ModifierFlags flags) : TypedAstNode(type, flags) {} private: bool grouped_ {}; diff --git a/ir/ts/tsTypeParameter.cpp b/ir/ts/tsTypeParameter.cpp index 69b18aeb8..f63c96415 100644 --- a/ir/ts/tsTypeParameter.cpp +++ b/ir/ts/tsTypeParameter.cpp @@ -40,6 +40,8 @@ void TSTypeParameter::Dump(ir::AstDumper *dumper) const {"name", name_}, {"constraint", AstDumper::Optional(constraint_)}, {"default", AstDumper::Optional(defaultType_)}, + {"in", AstDumper::Optional(IsIn())}, + {"out", AstDumper::Optional(IsOut())}, }); } diff --git a/ir/ts/tsTypeParameter.h b/ir/ts/tsTypeParameter.h index 0824ff561..a7be6d374 100644 --- a/ir/ts/tsTypeParameter.h +++ b/ir/ts/tsTypeParameter.h @@ -28,6 +28,15 @@ public: { } + explicit TSTypeParameter(Identifier *name, TypeNode *constraint, TypeNode *defaultType, ModifierFlags flags) + : Expression(AstNodeType::TS_TYPE_PARAMETER, flags), + name_(name), + constraint_(constraint), + defaultType_(defaultType) + { + ASSERT(flags == ModifierFlags::NONE || flags == ModifierFlags::IN || flags == ModifierFlags::OUT); + } + const Identifier *Name() const { return name_; diff --git a/ir/typeNode.h b/ir/typeNode.h index 20d0c22ff..e36d0d4ed 100644 --- a/ir/typeNode.h +++ b/ir/typeNode.h @@ -27,6 +27,7 @@ namespace panda::es2panda::ir { class TypeNode : public Expression { public: explicit TypeNode(AstNodeType type) : Expression(type) {} + explicit TypeNode(AstNodeType type, ModifierFlags flags) : Expression(type, flags) {} bool IsTypeNode() const override { diff --git a/lexer/scripts/keywords.yaml b/lexer/scripts/keywords.yaml index ed1ff9684..97b395468 100644 --- a/lexer/scripts/keywords.yaml +++ b/lexer/scripts/keywords.yaml @@ -246,7 +246,8 @@ keywords: - name: 'in' token: KEYW_IN - keyword: [as, js, ets, ts] + keyword: [as, js, ts] + keyword_like: [ets] - name: 'infer' token: KEYW_INFER @@ -330,6 +331,10 @@ keywords: token: KEYW_OPEN keyword: [ets] + - name: 'out' + token: KEYW_OUT + keyword_like: [ets] + - name: 'override' token: KEYW_OVERRIDE keyword: [ets] diff --git a/lexer/token/token.cpp b/lexer/token/token.cpp index 6fdb73ff4..41b82d578 100644 --- a/lexer/token/token.cpp +++ b/lexer/token/token.cpp @@ -416,6 +416,8 @@ const char *TokenToString(TokenType type) // NOLINT(readability-function-size) return "else"; case TokenType::EOS: return "eos"; + case TokenType::KEYW_OUT: + return "out"; default: return {}; } diff --git a/lexer/token/tokenType.h b/lexer/token/tokenType.h index e73529c49..b46008375 100644 --- a/lexer/token/tokenType.h +++ b/lexer/token/tokenType.h @@ -106,6 +106,7 @@ enum class TokenType { KEYW_REQUIRE, KEYW_ABSTRACT, KEYW_TARGET, + KEYW_OUT, /* reserved keywords */ FIRST_KEYW, diff --git a/parser/ASparser.cpp b/parser/ASparser.cpp index 737789826..4d67c7d11 100644 --- a/parser/ASparser.cpp +++ b/parser/ASparser.cpp @@ -131,7 +131,8 @@ ir::TSTypeAliasDeclaration *ASParser::ParseTypeAliasDeclaration() auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + typeParamDecl = ParseTypeParameterDeclaration(&options); } if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SUBSTITUTION) { @@ -1023,7 +1024,8 @@ ir::AstNode *ASParser::ParsePropertyOrMethodSignature(const lexer::SourcePositio ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + typeParamDecl = ParseTypeParameterDeclaration(&options); } FunctionParameterContext funcParamContext(&GetContext(), Binder()); diff --git a/parser/ETSparser.cpp b/parser/ETSparser.cpp index bb4eb0412..12bb88d4f 100644 --- a/parser/ETSparser.cpp +++ b/parser/ETSparser.cpp @@ -544,9 +544,8 @@ ir::ModifierFlags ETSParser::ParseClassModifiers() std::tuple ETSParser::ParseClassImplementsElement() { - TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR | - TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE | - TypeAnnotationParsingOptions::ALLOW_WILDCARD; + TypeAnnotationParsingOptions options = + TypeAnnotationParsingOptions::THROW_ERROR | TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE; return {ParseTypeReference(&options), nullptr}; } @@ -555,9 +554,8 @@ ir::Expression *ETSParser::ParseSuperClassReference() if (Lexer()->GetToken().Type() == lexer::TokenType::KEYW_EXTENDS) { Lexer()->NextToken(); - TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR | - TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE | - TypeAnnotationParsingOptions::ALLOW_WILDCARD; + TypeAnnotationParsingOptions options = + TypeAnnotationParsingOptions::THROW_ERROR | TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE; return ParseTypeReference(&options); } @@ -566,9 +564,8 @@ ir::Expression *ETSParser::ParseSuperClassReference() ir::TypeNode *ETSParser::ParseInterfaceExtendsElement() { - TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR | - TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE | - TypeAnnotationParsingOptions::ALLOW_WILDCARD; + TypeAnnotationParsingOptions options = + TypeAnnotationParsingOptions::THROW_ERROR | TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE; return ParseTypeReference(&options); } @@ -1017,7 +1014,9 @@ ir::TSTypeAliasDeclaration *ETSParser::ParseTypeAliasDeclaration() auto typeParamsCtx = binder::LexicalScope(Binder()); if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - ir::TSTypeParameterDeclaration *params = ParseTypeParameterDeclaration(); + auto options = + TypeAnnotationParsingOptions::THROW_ERROR | TypeAnnotationParsingOptions::ALLOW_DECLARATION_SITE_VARIANCE; + ir::TSTypeParameterDeclaration *params = ParseTypeParameterDeclaration(&options); typeAliasDecl->AddTypeParameters(params); params->SetParent(typeAliasDecl); } @@ -1044,7 +1043,9 @@ ir::TSInterfaceDeclaration *ETSParser::ParseInterfaceBody(ir::Identifier *name, auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = + TypeAnnotationParsingOptions::THROW_ERROR | TypeAnnotationParsingOptions::ALLOW_DECLARATION_SITE_VARIANCE; + typeParamDecl = ParseTypeParameterDeclaration(&options); } ArenaVector extends(Allocator()->Adapter()); @@ -1112,7 +1113,9 @@ ir::ClassDefinition *ETSParser::ParseClassDefinition(ir::ClassDefinitionModifier auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = + TypeAnnotationParsingOptions::THROW_ERROR | TypeAnnotationParsingOptions::ALLOW_DECLARATION_SITE_VARIANCE; + typeParamDecl = ParseTypeParameterDeclaration(&options); } auto classCtx = binder::LexicalScope(Binder()); @@ -1374,8 +1377,9 @@ std::tuple ETSParser::Pars if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_SHIFT) { Lexer()->BackwardToken(lexer::TokenType::PUNCTUATOR_LESS_THAN, 1); } - + *options |= TypeAnnotationParsingOptions::ALLOW_WILDCARD; typeParamInst = ParseTypeParameterInstantiation(options); + *options &= ~TypeAnnotationParsingOptions::ALLOW_WILDCARD; } return {typeName, typeParamInst}; @@ -1492,34 +1496,26 @@ ir::TSIntersectionType *ETSParser::ParseIntersectionType(ir::Expression *type) intersectionType->SetRange({startLoc, endLoc}); return intersectionType; } - ir::TypeNode *ETSParser::ParseWildcardType(TypeAnnotationParsingOptions *options) { - if (((*options) & TypeAnnotationParsingOptions::ALLOW_WILDCARD) == 0) { - return nullptr; - } - - auto *typeAnnotation = AllocNode(); - typeAnnotation->SetRange(Lexer()->GetToken().Loc()); - Lexer()->NextToken(); + const auto varianceStartLoc = Lexer()->GetToken().Start(); + const auto varianceEndLoc = Lexer()->GetToken().End(); + const auto varianceModifier = ParseTypeVarianceModifier(options); - if (Lexer()->GetToken().Type() == lexer::TokenType::KEYW_EXTENDS || - Lexer()->GetToken().Type() == lexer::TokenType::KEYW_SUPER) { - bool superBound = Lexer()->GetToken().Type() == lexer::TokenType::KEYW_SUPER; - Lexer()->NextToken(); // eat 'extends' - - auto *bound = ParseTypeReference(options); - - if (superBound) { - typeAnnotation->SetSuperBound(bound->AsETSTypeReference()); - } else { - typeAnnotation->SetExtendsBound(bound->AsETSTypeReference()); + auto *typeReference = [this, &varianceModifier, options]() -> ir::ETSTypeReference * { + if (varianceModifier == ir::ModifierFlags::OUT && + (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_GREATER_THAN || + Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COMMA)) { + // unbounded 'out' + return nullptr; } + return ParseTypeReference(options)->AsETSTypeReference(); + }(); - typeAnnotation->SetEnd(bound->End()); - } + auto *wildcardType = AllocNode(typeReference, varianceModifier); + wildcardType->SetRange({varianceStartLoc, typeReference == nullptr ? varianceEndLoc : typeReference->End()}); - return typeAnnotation; + return wildcardType; } ir::TypeNode *ETSParser::ParseFunctionType() @@ -1627,7 +1623,13 @@ ir::TypeNode *ETSParser::ParseTypeAnnotation(TypeAnnotationParsingOptions *optio switch (Lexer()->GetToken().Type()) { case lexer::TokenType::LITERAL_IDENT: { - typeAnnotation = ParseTypeReference(options); + if (const auto keyword = Lexer()->GetToken().KeywordType(); + keyword == lexer::TokenType::KEYW_IN || keyword == lexer::TokenType::KEYW_OUT) { + typeAnnotation = ParseWildcardType(options); + } else { + typeAnnotation = ParseTypeReference(options); + } + if (((*options) & TypeAnnotationParsingOptions::POTENTIAL_CLASS_LITERAL) != 0 && Lexer()->GetToken().Type() == lexer::TokenType::KEYW_CLASS) { return typeAnnotation; @@ -1670,10 +1672,6 @@ ir::TypeNode *ETSParser::ParseTypeAnnotation(TypeAnnotationParsingOptions *optio typeAnnotation = ParsePrimitiveType(options, ir::PrimitiveType::SHORT); break; } - case lexer::TokenType::PUNCTUATOR_QUESTION_MARK: { - typeAnnotation = ParseWildcardType(options); - break; - } case lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS: { if (((*options) & TypeAnnotationParsingOptions::IGNORE_FUNCTION_TYPE) != 0) { break; @@ -2240,9 +2238,8 @@ bool ETSParser::ParsePotentialGenericFunctionCall(ir::Expression *primaryExpr, i Lexer()->BackwardToken(lexer::TokenType::PUNCTUATOR_LESS_THAN, 1); } - TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE | - TypeAnnotationParsingOptions::ALLOW_WILDCARD | - TypeAnnotationParsingOptions::IGNORE_FUNCTION_TYPE; + TypeAnnotationParsingOptions options = + TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE | TypeAnnotationParsingOptions::IGNORE_FUNCTION_TYPE; ir::TSTypeParameterInstantiation *typeParams = ParseTypeParameterInstantiation(&options); if (typeParams == nullptr) { @@ -2492,7 +2489,7 @@ ir::Expression *ETSParser::ParseNewExpression() TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; ir::TypeNode *typeReference = ParseBaseTypeReference(&options); if (typeReference == nullptr) { - options |= TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE | TypeAnnotationParsingOptions::ALLOW_WILDCARD; + options |= TypeAnnotationParsingOptions::DISALLOW_PRIMARY_TYPE; typeReference = ParseTypeReference(&options); } else if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE) { ThrowSyntaxError("Invalid { after base types."); @@ -2580,9 +2577,42 @@ ir::Expression *ETSParser::ParseNewExpression() return newExprNode; } +ir::ModifierFlags ETSParser::ParseTypeVarianceModifier(TypeAnnotationParsingOptions *const options) +{ + if ((*options & TypeAnnotationParsingOptions::ALLOW_WILDCARD) == 0 && + (*options & TypeAnnotationParsingOptions::ALLOW_DECLARATION_SITE_VARIANCE) == 0) { + ThrowSyntaxError("Variance modifier is not allowed here."); + } + + switch (Lexer()->GetToken().KeywordType()) { + case lexer::TokenType::KEYW_IN: { + Lexer()->NextToken(); + return ir::ModifierFlags::IN; + } + case lexer::TokenType::KEYW_OUT: { + Lexer()->NextToken(); + return ir::ModifierFlags::OUT; + } + default: { + return ir::ModifierFlags::NONE; + } + } +} + ir::TSTypeParameter *ETSParser::ParseTypeParameter([[maybe_unused]] TypeAnnotationParsingOptions *options) { lexer::SourcePosition startLoc = Lexer()->GetToken().Start(); + + const auto varianceModifier = [this, options] { + switch (Lexer()->GetToken().KeywordType()) { + case lexer::TokenType::KEYW_IN: + case lexer::TokenType::KEYW_OUT: + return ParseTypeVarianceModifier(options); + default: + return ir::ModifierFlags::NONE; + } + }(); + auto *paramIdent = ExpectIdentifier(); binder::Decl *decl = Binder()->AddDecl(paramIdent->Start(), paramIdent->Name()); @@ -2595,7 +2625,7 @@ ir::TSTypeParameter *ETSParser::ParseTypeParameter([[maybe_unused]] TypeAnnotati constraint = ParseTypeAnnotation(&newOptions); } - auto *typeParam = AllocNode(paramIdent, constraint, nullptr); + auto *typeParam = AllocNode(paramIdent, constraint, nullptr, varianceModifier); decl->BindNode(typeParam); typeParam->SetRange({startLoc, Lexer()->GetToken().End()}); return typeParam; diff --git a/parser/ETSparser.h b/parser/ETSparser.h index 702bfee3d..5650735cd 100644 --- a/parser/ETSparser.h +++ b/parser/ETSparser.h @@ -178,6 +178,8 @@ private: util::StringView FormInterfaceOrEnumDeclarationIdBinding(ir::Identifier *id) override; + ir::ModifierFlags ParseTypeVarianceModifier(TypeAnnotationParsingOptions *options); + friend class ExternalSourceParser; friend class InnerSourceParser; diff --git a/parser/TSparser.cpp b/parser/TSparser.cpp index 08f715ffc..1a09f3c75 100644 --- a/parser/TSparser.cpp +++ b/parser/TSparser.cpp @@ -204,7 +204,8 @@ ir::TSTypeAliasDeclaration *TSParser::ParseTypeAliasDeclaration() auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + typeParamDecl = ParseTypeParameterDeclaration(&options); } if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SUBSTITUTION) { @@ -1431,7 +1432,8 @@ ir::TypeNode *TSParser::ParseFunctionType(lexer::SourcePosition startLoc, bool i ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(throwError); + auto options = throwError ? TypeAnnotationParsingOptions::THROW_ERROR : TypeAnnotationParsingOptions::NO_OPTS; + typeParamDecl = ParseTypeParameterDeclaration(&options); if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) { if (!throwError) { @@ -1636,7 +1638,8 @@ ir::ArrowFunctionExpression *TSParser::ParsePotentialArrowExpression(ir::Express const auto savedPos = Lexer()->Save(); auto typeParamsCtx = binder::LexicalScope(Binder()); - typeParamDecl = ParseTypeParameterDeclaration(false); + auto options = TypeAnnotationParsingOptions::NO_OPTS; + typeParamDecl = ParseTypeParameterDeclaration(&options); if (typeParamDecl == nullptr) { Lexer()->Rewind(savedPos); return nullptr; @@ -1781,7 +1784,8 @@ ir::TSSignatureDeclaration *TSParser::ParseSignatureMember(bool isCallSignature) auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + typeParamDecl = ParseTypeParameterDeclaration(&options); if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) { ThrowSyntaxError("'(' expected"); @@ -1980,7 +1984,8 @@ ir::AstNode *TSParser::ParsePropertyOrMethodSignature(const lexer::SourcePositio auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + typeParamDecl = ParseTypeParameterDeclaration(&options); } if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) { diff --git a/parser/TypedParser.cpp b/parser/TypedParser.cpp index 1af3a75fc..284aaccdc 100644 --- a/parser/TypedParser.cpp +++ b/parser/TypedParser.cpp @@ -202,7 +202,9 @@ ir::ArrowFunctionExpression *TypedParser::ParseGenericArrowFunction() lexer::SourcePosition startLoc = Lexer()->GetToken().Start(); auto typeParamsCtx = binder::LexicalScope(Binder()); - ir::TSTypeParameterDeclaration *typeParamDecl = ParseTypeParameterDeclaration(false); + + auto typeParamDeclOptions = TypeAnnotationParsingOptions::NO_OPTS; + ir::TSTypeParameterDeclaration *typeParamDecl = ParseTypeParameterDeclaration(&typeParamDeclOptions); if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) { return nullptr; @@ -439,7 +441,8 @@ ArenaVector TypedParser::ParseInterfaceExtendsClause( ir::TSTypeParameterDeclaration *TypedParser::ParseFunctionTypeParameters() { if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - return ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + return ParseTypeParameterDeclaration(&options); } return nullptr; @@ -499,7 +502,8 @@ ir::Statement *TypedParser::ParseInterfaceDeclaration(bool isStatic) auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + typeParamDecl = ParseTypeParameterDeclaration(&options); } ArenaVector extends(Allocator()->Adapter()); @@ -774,7 +778,7 @@ ir::TSTypeParameter *TypedParser::ParseTypeParameter(TypeAnnotationParsingOption return typeParam; } -ir::TSTypeParameterDeclaration *TypedParser::ParseTypeParameterDeclaration(bool throwError) +ir::TSTypeParameterDeclaration *TypedParser::ParseTypeParameterDeclaration(TypeAnnotationParsingOptions *options) { ASSERT(Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN); @@ -785,16 +789,11 @@ ir::TSTypeParameterDeclaration *TypedParser::ParseTypeParameterDeclaration(bool Lexer()->NextToken(); // eat '<' while (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_GREATER_THAN) { - TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::ADD_TYPE_PARAMETER_BINDING; - - if (throwError) { - options |= TypeAnnotationParsingOptions::THROW_ERROR; - } - - ir::TSTypeParameter *currentParam = ParseTypeParameter(&options); + auto newOptions = *options | TypeAnnotationParsingOptions::ADD_TYPE_PARAMETER_BINDING; + ir::TSTypeParameter *currentParam = ParseTypeParameter(&newOptions); if (currentParam == nullptr) { - ASSERT(!throwError); + ASSERT((newOptions & TypeAnnotationParsingOptions::THROW_ERROR) == 0); return nullptr; } @@ -814,7 +813,7 @@ ir::TSTypeParameterDeclaration *TypedParser::ParseTypeParameterDeclaration(bool } if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_GREATER_THAN) { - if (!throwError) { + if ((newOptions & TypeAnnotationParsingOptions::THROW_ERROR) == 0) { return nullptr; } @@ -942,7 +941,8 @@ ir::ClassDefinition *TypedParser::ParseClassDefinition(ir::ClassDefinitionModifi auto typeParamsCtx = binder::LexicalScope(Binder()); ir::TSTypeParameterDeclaration *typeParamDecl = nullptr; if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) { - typeParamDecl = ParseTypeParameterDeclaration(); + auto options = TypeAnnotationParsingOptions::THROW_ERROR; + typeParamDecl = ParseTypeParameterDeclaration(&options); } auto classCtx = binder::LexicalScope(Binder()); diff --git a/parser/TypedParser.h b/parser/TypedParser.h index 4bda1a036..0348c6ba1 100644 --- a/parser/TypedParser.h +++ b/parser/TypedParser.h @@ -43,7 +43,7 @@ protected: ir::TSTypeAssertion *ParseTypeAssertion(); ir::TSTypeParameterInstantiation *ParseTypeParameterInstantiation(TypeAnnotationParsingOptions *options); - ir::TSTypeParameterDeclaration *ParseTypeParameterDeclaration(bool throwError = true); + ir::TSTypeParameterDeclaration *ParseTypeParameterDeclaration(TypeAnnotationParsingOptions *options); ir::Expression *ParseQualifiedName(ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS); ir::Expression *ParseQualifiedReference(ir::Expression *typeName, ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS); diff --git a/parser/parserImpl.h b/parser/parserImpl.h index ee04d2129..0614946e4 100644 --- a/parser/parserImpl.h +++ b/parser/parserImpl.h @@ -160,7 +160,8 @@ enum class TypeAnnotationParsingOptions : uint32_t { ADD_TYPE_PARAMETER_BINDING = 1U << 10U, DISALLOW_PRIMARY_TYPE = 1U << 11U, ALLOW_WILDCARD = 1U << 12U, - IGNORE_FUNCTION_TYPE = 1U << 13U + IGNORE_FUNCTION_TYPE = 1U << 13U, + ALLOW_DECLARATION_SITE_VARIANCE = 1U << 14U, }; DEFINE_BITOPS(TypeAnnotationParsingOptions) diff --git a/test/parser/ets/type_variance1-expected.txt b/test/parser/ets/type_variance1-expected.txt new file mode 100644 index 000000000..b28540a5f --- /dev/null +++ b/test/parser/ets/type_variance1-expected.txt @@ -0,0 +1,3331 @@ +{ + "type": "Program", + "statements": [ + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "C", + "decorators": [], + "loc": { + "start": { + "line": 16, + "column": 7 + }, + "end": { + "line": 16, + "column": 8 + } + } + }, + "typeParameters": { + "type": "TSTypeParameterDeclaration", + "params": [ + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "T", + "decorators": [], + "loc": { + "start": { + "line": 16, + "column": 12 + }, + "end": { + "line": 16, + "column": 13 + } + } + }, + "in": true, + "loc": { + "start": { + "line": 16, + "column": 9 + }, + "end": { + "line": 16, + "column": 14 + } + } + } + ], + "loc": { + "start": { + "line": 16, + "column": 8 + }, + "end": { + "line": 16, + "column": 14 + } + } + }, + "superClass": null, + "implements": [], + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "set", + "decorators": [], + "loc": { + "start": { + "line": 17, + "column": 5 + }, + "end": { + "line": 17, + "column": 8 + } + } + }, + "kind": "method", + "accessibility": "public", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "set", + "decorators": [], + "loc": { + "start": { + "line": 17, + "column": 5 + }, + "end": { + "line": 17, + "column": 8 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [ + { + "type": "Identifier", + "name": "_", + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "T", + "decorators": [], + "loc": { + "start": { + "line": 17, + "column": 12 + }, + "end": { + "line": 17, + "column": 13 + } + } + }, + "loc": { + "start": { + "line": 17, + "column": 12 + }, + "end": { + "line": 17, + "column": 14 + } + } + }, + "loc": { + "start": { + "line": 17, + "column": 12 + }, + "end": { + "line": 17, + "column": 14 + } + } + }, + "decorators": [], + "loc": { + "start": { + "line": 17, + "column": 9 + }, + "end": { + "line": 17, + "column": 14 + } + } + } + ], + "returnType": { + "type": "ETSPrimitiveType", + "loc": { + "start": { + "line": 17, + "column": 16 + }, + "end": { + "line": 17, + "column": 20 + } + } + }, + "body": { + "type": "BlockStatement", + "statements": [], + "loc": { + "start": { + "line": 17, + "column": 21 + }, + "end": { + "line": 17, + "column": 23 + } + } + }, + "loc": { + "start": { + "line": 17, + "column": 8 + }, + "end": { + "line": 17, + "column": 23 + } + } + }, + "loc": { + "start": { + "line": 17, + "column": 8 + }, + "end": { + "line": 17, + "column": 23 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 17, + "column": 5 + }, + "end": { + "line": 17, + "column": 23 + } + } + }, + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "kind": "constructor", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "body": { + "type": "BlockStatement", + "statements": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 18, + "column": 2 + }, + "end": { + "line": 18, + "column": 2 + } + } + } + ], + "loc": { + "start": { + "line": 16, + "column": 15 + }, + "end": { + "line": 18, + "column": 2 + } + } + }, + "loc": { + "start": { + "line": 16, + "column": 1 + }, + "end": { + "line": 18, + "column": 2 + } + } + }, + { + "type": "TSInterfaceDeclaration", + "body": { + "type": "TSInterfaceBody", + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "set", + "decorators": [], + "loc": { + "start": { + "line": 23, + "column": 5 + }, + "end": { + "line": 23, + "column": 8 + } + } + }, + "kind": "method", + "accessibility": "public", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "set", + "decorators": [], + "loc": { + "start": { + "line": 23, + "column": 5 + }, + "end": { + "line": 23, + "column": 8 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [ + { + "type": "Identifier", + "name": "_", + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "In_T", + "decorators": [], + "loc": { + "start": { + "line": 23, + "column": 12 + }, + "end": { + "line": 23, + "column": 16 + } + } + }, + "loc": { + "start": { + "line": 23, + "column": 12 + }, + "end": { + "line": 23, + "column": 17 + } + } + }, + "loc": { + "start": { + "line": 23, + "column": 12 + }, + "end": { + "line": 23, + "column": 17 + } + } + }, + "decorators": [], + "loc": { + "start": { + "line": 23, + "column": 9 + }, + "end": { + "line": 23, + "column": 17 + } + } + } + ], + "returnType": { + "type": "ETSPrimitiveType", + "loc": { + "start": { + "line": 23, + "column": 19 + }, + "end": { + "line": 23, + "column": 23 + } + } + }, + "declare": true, + "loc": { + "start": { + "line": 23, + "column": 8 + }, + "end": { + "line": 23, + "column": 23 + } + } + }, + "loc": { + "start": { + "line": 23, + "column": 8 + }, + "end": { + "line": 23, + "column": 23 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 23, + "column": 5 + }, + "end": { + "line": 23, + "column": 23 + } + } + }, + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "get", + "decorators": [], + "loc": { + "start": { + "line": 24, + "column": 5 + }, + "end": { + "line": 24, + "column": 8 + } + } + }, + "kind": "method", + "accessibility": "public", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "get", + "decorators": [], + "loc": { + "start": { + "line": 24, + "column": 5 + }, + "end": { + "line": 24, + "column": 8 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "returnType": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Out_T", + "decorators": [], + "loc": { + "start": { + "line": 24, + "column": 12 + }, + "end": { + "line": 24, + "column": 17 + } + } + }, + "loc": { + "start": { + "line": 24, + "column": 12 + }, + "end": { + "line": 24, + "column": 18 + } + } + }, + "loc": { + "start": { + "line": 24, + "column": 12 + }, + "end": { + "line": 24, + "column": 18 + } + } + }, + "declare": true, + "loc": { + "start": { + "line": 24, + "column": 8 + }, + "end": { + "line": 24, + "column": 18 + } + } + }, + "loc": { + "start": { + "line": 24, + "column": 8 + }, + "end": { + "line": 24, + "column": 18 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 24, + "column": 5 + }, + "end": { + "line": 24, + "column": 18 + } + } + } + ], + "loc": { + "start": { + "line": 22, + "column": 50 + }, + "end": { + "line": 25, + "column": 2 + } + } + }, + "id": { + "type": "Identifier", + "name": "Declaration_Site_I", + "decorators": [], + "loc": { + "start": { + "line": 22, + "column": 11 + }, + "end": { + "line": 22, + "column": 29 + } + } + }, + "extends": [], + "typeParameters": { + "type": "TSTypeParameterDeclaration", + "params": [ + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "In_T", + "decorators": [], + "loc": { + "start": { + "line": 22, + "column": 33 + }, + "end": { + "line": 22, + "column": 37 + } + } + }, + "in": true, + "loc": { + "start": { + "line": 22, + "column": 30 + }, + "end": { + "line": 22, + "column": 38 + } + } + }, + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "Out_T", + "decorators": [], + "loc": { + "start": { + "line": 22, + "column": 43 + }, + "end": { + "line": 22, + "column": 48 + } + } + }, + "out": true, + "loc": { + "start": { + "line": 22, + "column": 39 + }, + "end": { + "line": 22, + "column": 49 + } + } + } + ], + "loc": { + "start": { + "line": 22, + "column": 29 + }, + "end": { + "line": 22, + "column": 49 + } + } + }, + "loc": { + "start": { + "line": 22, + "column": 1 + }, + "end": { + "line": 27, + "column": 10 + } + } + }, + { + "type": "TSInterfaceDeclaration", + "body": { + "type": "TSInterfaceBody", + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "set", + "decorators": [], + "loc": { + "start": { + "line": 28, + "column": 5 + }, + "end": { + "line": 28, + "column": 8 + } + } + }, + "kind": "method", + "accessibility": "public", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "set", + "decorators": [], + "loc": { + "start": { + "line": 28, + "column": 5 + }, + "end": { + "line": 28, + "column": 8 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [ + { + "type": "Identifier", + "name": "_", + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "In_T", + "decorators": [], + "loc": { + "start": { + "line": 28, + "column": 12 + }, + "end": { + "line": 28, + "column": 16 + } + } + }, + "loc": { + "start": { + "line": 28, + "column": 12 + }, + "end": { + "line": 28, + "column": 17 + } + } + }, + "loc": { + "start": { + "line": 28, + "column": 12 + }, + "end": { + "line": 28, + "column": 17 + } + } + }, + "decorators": [], + "loc": { + "start": { + "line": 28, + "column": 9 + }, + "end": { + "line": 28, + "column": 17 + } + } + } + ], + "returnType": { + "type": "ETSPrimitiveType", + "loc": { + "start": { + "line": 28, + "column": 19 + }, + "end": { + "line": 28, + "column": 23 + } + } + }, + "declare": true, + "loc": { + "start": { + "line": 28, + "column": 8 + }, + "end": { + "line": 28, + "column": 23 + } + } + }, + "loc": { + "start": { + "line": 28, + "column": 8 + }, + "end": { + "line": 28, + "column": 23 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 28, + "column": 5 + }, + "end": { + "line": 28, + "column": 23 + } + } + }, + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "get", + "decorators": [], + "loc": { + "start": { + "line": 29, + "column": 5 + }, + "end": { + "line": 29, + "column": 8 + } + } + }, + "kind": "method", + "accessibility": "public", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "get", + "decorators": [], + "loc": { + "start": { + "line": 29, + "column": 5 + }, + "end": { + "line": 29, + "column": 8 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "returnType": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Out_T", + "decorators": [], + "loc": { + "start": { + "line": 29, + "column": 12 + }, + "end": { + "line": 29, + "column": 17 + } + } + }, + "loc": { + "start": { + "line": 29, + "column": 12 + }, + "end": { + "line": 29, + "column": 18 + } + } + }, + "loc": { + "start": { + "line": 29, + "column": 12 + }, + "end": { + "line": 29, + "column": 18 + } + } + }, + "declare": true, + "loc": { + "start": { + "line": 29, + "column": 8 + }, + "end": { + "line": 29, + "column": 18 + } + } + }, + "loc": { + "start": { + "line": 29, + "column": 8 + }, + "end": { + "line": 29, + "column": 18 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 29, + "column": 5 + }, + "end": { + "line": 29, + "column": 18 + } + } + } + ], + "loc": { + "start": { + "line": 27, + "column": 35 + }, + "end": { + "line": 30, + "column": 2 + } + } + }, + "id": { + "type": "Identifier", + "name": "Use_Site_I", + "decorators": [], + "loc": { + "start": { + "line": 27, + "column": 11 + }, + "end": { + "line": 27, + "column": 21 + } + } + }, + "extends": [], + "typeParameters": { + "type": "TSTypeParameterDeclaration", + "params": [ + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "In_T", + "decorators": [], + "loc": { + "start": { + "line": 27, + "column": 22 + }, + "end": { + "line": 27, + "column": 26 + } + } + }, + "loc": { + "start": { + "line": 27, + "column": 22 + }, + "end": { + "line": 27, + "column": 27 + } + } + }, + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "Out_T", + "decorators": [], + "loc": { + "start": { + "line": 27, + "column": 28 + }, + "end": { + "line": 27, + "column": 33 + } + } + }, + "loc": { + "start": { + "line": 27, + "column": 28 + }, + "end": { + "line": 27, + "column": 34 + } + } + } + ], + "loc": { + "start": { + "line": 27, + "column": 21 + }, + "end": { + "line": 27, + "column": 34 + } + } + }, + "loc": { + "start": { + "line": 27, + "column": 1 + }, + "end": { + "line": 32, + "column": 6 + } + } + }, + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "O", + "decorators": [], + "loc": { + "start": { + "line": 32, + "column": 7 + }, + "end": { + "line": 32, + "column": 8 + } + } + }, + "superClass": null, + "implements": [], + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "kind": "constructor", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "body": { + "type": "BlockStatement", + "statements": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 32, + "column": 11 + }, + "end": { + "line": 32, + "column": 11 + } + } + } + ], + "loc": { + "start": { + "line": 32, + "column": 9 + }, + "end": { + "line": 32, + "column": 11 + } + } + }, + "loc": { + "start": { + "line": 32, + "column": 1 + }, + "end": { + "line": 32, + "column": 11 + } + } + }, + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "Declaration_Site_C", + "decorators": [], + "loc": { + "start": { + "line": 34, + "column": 7 + }, + "end": { + "line": 34, + "column": 25 + } + } + }, + "superClass": null, + "implements": [ + { + "type": "TSClassImplements", + "expression": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Declaration_Site_I", + "decorators": [], + "loc": { + "start": { + "line": 34, + "column": 37 + }, + "end": { + "line": 34, + "column": 55 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O", + "decorators": [], + "loc": { + "start": { + "line": 34, + "column": 56 + }, + "end": { + "line": 34, + "column": 57 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 56 + }, + "end": { + "line": 34, + "column": 58 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 56 + }, + "end": { + "line": 34, + "column": 58 + } + } + }, + { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O", + "decorators": [], + "loc": { + "start": { + "line": 34, + "column": 59 + }, + "end": { + "line": 34, + "column": 60 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 59 + }, + "end": { + "line": 34, + "column": 61 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 59 + }, + "end": { + "line": 34, + "column": 61 + } + } + } + ], + "loc": { + "start": { + "line": 34, + "column": 55 + }, + "end": { + "line": 34, + "column": 61 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 37 + }, + "end": { + "line": 34, + "column": 63 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 37 + }, + "end": { + "line": 34, + "column": 63 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 37 + }, + "end": { + "line": 34, + "column": 63 + } + } + } + ], + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "kind": "constructor", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "body": { + "type": "BlockStatement", + "statements": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 34, + "column": 64 + }, + "end": { + "line": 34, + "column": 64 + } + } + } + ], + "loc": { + "start": { + "line": 34, + "column": 62 + }, + "end": { + "line": 34, + "column": 64 + } + } + }, + "loc": { + "start": { + "line": 34, + "column": 1 + }, + "end": { + "line": 34, + "column": 64 + } + } + }, + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "Use_Site_C", + "decorators": [], + "loc": { + "start": { + "line": 36, + "column": 7 + }, + "end": { + "line": 36, + "column": 17 + } + } + }, + "superClass": null, + "implements": [ + { + "type": "TSClassImplements", + "expression": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Use_Site_I", + "decorators": [], + "loc": { + "start": { + "line": 36, + "column": 29 + }, + "end": { + "line": 36, + "column": 39 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "ETSWildcardType", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O", + "decorators": [], + "loc": { + "start": { + "line": 36, + "column": 43 + }, + "end": { + "line": 36, + "column": 44 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 43 + }, + "end": { + "line": 36, + "column": 45 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 43 + }, + "end": { + "line": 36, + "column": 45 + } + } + }, + "in": true, + "loc": { + "start": { + "line": 36, + "column": 40 + }, + "end": { + "line": 36, + "column": 45 + } + } + }, + { + "type": "ETSWildcardType", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O", + "decorators": [], + "loc": { + "start": { + "line": 36, + "column": 50 + }, + "end": { + "line": 36, + "column": 51 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 50 + }, + "end": { + "line": 36, + "column": 52 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 50 + }, + "end": { + "line": 36, + "column": 52 + } + } + }, + "out": true, + "loc": { + "start": { + "line": 36, + "column": 46 + }, + "end": { + "line": 36, + "column": 52 + } + } + } + ], + "loc": { + "start": { + "line": 36, + "column": 39 + }, + "end": { + "line": 36, + "column": 52 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 29 + }, + "end": { + "line": 36, + "column": 54 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 29 + }, + "end": { + "line": 36, + "column": 54 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 29 + }, + "end": { + "line": 36, + "column": 54 + } + } + } + ], + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "kind": "constructor", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "body": { + "type": "BlockStatement", + "statements": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 36, + "column": 55 + }, + "end": { + "line": 36, + "column": 55 + } + } + } + ], + "loc": { + "start": { + "line": 36, + "column": 53 + }, + "end": { + "line": 36, + "column": 55 + } + } + }, + "loc": { + "start": { + "line": 36, + "column": 1 + }, + "end": { + "line": 36, + "column": 55 + } + } + }, + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "Outbounded_Use_Site_C", + "decorators": [], + "loc": { + "start": { + "line": 38, + "column": 7 + }, + "end": { + "line": 38, + "column": 28 + } + } + }, + "superClass": null, + "implements": [ + { + "type": "TSClassImplements", + "expression": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Use_Site_I", + "decorators": [], + "loc": { + "start": { + "line": 38, + "column": 40 + }, + "end": { + "line": 38, + "column": 50 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "ETSWildcardType", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O", + "decorators": [], + "loc": { + "start": { + "line": 38, + "column": 54 + }, + "end": { + "line": 38, + "column": 55 + } + } + }, + "loc": { + "start": { + "line": 38, + "column": 54 + }, + "end": { + "line": 38, + "column": 56 + } + } + }, + "loc": { + "start": { + "line": 38, + "column": 54 + }, + "end": { + "line": 38, + "column": 56 + } + } + }, + "in": true, + "loc": { + "start": { + "line": 38, + "column": 51 + }, + "end": { + "line": 38, + "column": 56 + } + } + }, + { + "type": "ETSWildcardType", + "out": true, + "loc": { + "start": { + "line": 38, + "column": 57 + }, + "end": { + "line": 38, + "column": 60 + } + } + } + ], + "loc": { + "start": { + "line": 38, + "column": 50 + }, + "end": { + "line": 38, + "column": 61 + } + } + }, + "loc": { + "start": { + "line": 38, + "column": 40 + }, + "end": { + "line": 38, + "column": 63 + } + } + }, + "loc": { + "start": { + "line": 38, + "column": 40 + }, + "end": { + "line": 38, + "column": 63 + } + } + }, + "loc": { + "start": { + "line": 38, + "column": 40 + }, + "end": { + "line": 38, + "column": 63 + } + } + } + ], + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "kind": "constructor", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "body": { + "type": "BlockStatement", + "statements": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 38, + "column": 64 + }, + "end": { + "line": 38, + "column": 64 + } + } + } + ], + "loc": { + "start": { + "line": 38, + "column": 62 + }, + "end": { + "line": 38, + "column": 64 + } + } + }, + "loc": { + "start": { + "line": 38, + "column": 1 + }, + "end": { + "line": 38, + "column": 64 + } + } + }, + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "O2", + "decorators": [], + "loc": { + "start": { + "line": 40, + "column": 7 + }, + "end": { + "line": 40, + "column": 9 + } + } + }, + "typeParameters": { + "type": "TSTypeParameterDeclaration", + "params": [ + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "T", + "decorators": [], + "loc": { + "start": { + "line": 40, + "column": 10 + }, + "end": { + "line": 40, + "column": 11 + } + } + }, + "loc": { + "start": { + "line": 40, + "column": 10 + }, + "end": { + "line": 40, + "column": 12 + } + } + } + ], + "loc": { + "start": { + "line": 40, + "column": 9 + }, + "end": { + "line": 40, + "column": 12 + } + } + }, + "superClass": null, + "implements": [], + "body": [ + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "kind": "constructor", + "static": false, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "constructor", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "body": { + "type": "BlockStatement", + "statements": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 40, + "column": 15 + }, + "end": { + "line": 40, + "column": 15 + } + } + } + ], + "loc": { + "start": { + "line": 40, + "column": 13 + }, + "end": { + "line": 40, + "column": 15 + } + } + }, + "loc": { + "start": { + "line": 40, + "column": 1 + }, + "end": { + "line": 40, + "column": 15 + } + } + }, + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "ETSGLOBAL", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "superClass": null, + "implements": [], + "body": [ + { + "type": "ClassProperty", + "key": { + "type": "Identifier", + "name": "C_GLOBAL", + "decorators": [], + "loc": { + "start": { + "line": 20, + "column": 7 + }, + "end": { + "line": 20, + "column": 15 + } + } + }, + "value": { + "type": "ETSNewClassInstanceExpression", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "C", + "decorators": [], + "loc": { + "start": { + "line": 20, + "column": 38 + }, + "end": { + "line": 20, + "column": 39 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "TSArrayType", + "elementType": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Object", + "decorators": [], + "loc": { + "start": { + "line": 20, + "column": 40 + }, + "end": { + "line": 20, + "column": 46 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 40 + }, + "end": { + "line": 20, + "column": 47 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 40 + }, + "end": { + "line": 20, + "column": 47 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 48 + }, + "end": { + "line": 20, + "column": 49 + } + } + } + ], + "loc": { + "start": { + "line": 20, + "column": 39 + }, + "end": { + "line": 20, + "column": 49 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 38 + }, + "end": { + "line": 20, + "column": 50 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 38 + }, + "end": { + "line": 20, + "column": 50 + } + } + }, + "arguments": [], + "loc": { + "start": { + "line": 20, + "column": 34 + }, + "end": { + "line": 20, + "column": 52 + } + } + }, + "accessibility": "public", + "static": true, + "readonly": false, + "declare": false, + "optional": false, + "computed": false, + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "C", + "decorators": [], + "loc": { + "start": { + "line": 20, + "column": 17 + }, + "end": { + "line": 20, + "column": 18 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "TSArrayType", + "elementType": { + "type": "ETSWildcardType", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Object", + "decorators": [], + "loc": { + "start": { + "line": 20, + "column": 22 + }, + "end": { + "line": 20, + "column": 28 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 22 + }, + "end": { + "line": 20, + "column": 29 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 22 + }, + "end": { + "line": 20, + "column": 29 + } + } + }, + "in": true, + "loc": { + "start": { + "line": 20, + "column": 19 + }, + "end": { + "line": 20, + "column": 29 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 30 + }, + "end": { + "line": 20, + "column": 31 + } + } + } + ], + "loc": { + "start": { + "line": 20, + "column": 18 + }, + "end": { + "line": 20, + "column": 31 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 17 + }, + "end": { + "line": 20, + "column": 33 + } + } + }, + "loc": { + "start": { + "line": 20, + "column": 17 + }, + "end": { + "line": 20, + "column": 33 + } + } + }, + "definite": false, + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + { + "type": "MethodDefinition", + "key": { + "type": "Identifier", + "name": "test", + "decorators": [], + "loc": { + "start": { + "line": 42, + "column": 10 + }, + "end": { + "line": 42, + "column": 14 + } + } + }, + "kind": "method", + "accessibility": "public", + "static": true, + "optional": false, + "computed": false, + "value": { + "type": "FunctionExpression", + "function": { + "type": "ScriptFunction", + "id": { + "type": "Identifier", + "name": "test", + "decorators": [], + "loc": { + "start": { + "line": 42, + "column": 10 + }, + "end": { + "line": 42, + "column": 14 + } + } + }, + "generator": false, + "async": false, + "expression": false, + "params": [], + "returnType": { + "type": "ETSPrimitiveType", + "loc": { + "start": { + "line": 42, + "column": 18 + }, + "end": { + "line": 42, + "column": 22 + } + } + }, + "body": { + "type": "BlockStatement", + "statements": [ + { + "type": "VariableDeclaration", + "declarations": [ + { + "type": "VariableDeclarator", + "id": { + "type": "Identifier", + "name": "o", + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O2", + "decorators": [], + "loc": { + "start": { + "line": 43, + "column": 14 + }, + "end": { + "line": 43, + "column": 16 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "ETSWildcardType", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Object", + "decorators": [], + "loc": { + "start": { + "line": 43, + "column": 20 + }, + "end": { + "line": 43, + "column": 26 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 20 + }, + "end": { + "line": 43, + "column": 27 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 20 + }, + "end": { + "line": 43, + "column": 27 + } + } + }, + "in": true, + "loc": { + "start": { + "line": 43, + "column": 17 + }, + "end": { + "line": 43, + "column": 27 + } + } + } + ], + "loc": { + "start": { + "line": 43, + "column": 16 + }, + "end": { + "line": 43, + "column": 27 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 14 + }, + "end": { + "line": 43, + "column": 29 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 14 + }, + "end": { + "line": 43, + "column": 29 + } + } + }, + "decorators": [], + "loc": { + "start": { + "line": 43, + "column": 11 + }, + "end": { + "line": 43, + "column": 12 + } + } + }, + "init": { + "type": "ETSNewClassInstanceExpression", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O2", + "decorators": [], + "loc": { + "start": { + "line": 43, + "column": 34 + }, + "end": { + "line": 43, + "column": 36 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Object", + "decorators": [], + "loc": { + "start": { + "line": 43, + "column": 37 + }, + "end": { + "line": 43, + "column": 43 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 37 + }, + "end": { + "line": 43, + "column": 44 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 37 + }, + "end": { + "line": 43, + "column": 44 + } + } + } + ], + "loc": { + "start": { + "line": 43, + "column": 36 + }, + "end": { + "line": 43, + "column": 44 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 34 + }, + "end": { + "line": 43, + "column": 45 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 34 + }, + "end": { + "line": 43, + "column": 45 + } + } + }, + "arguments": [], + "loc": { + "start": { + "line": 43, + "column": 30 + }, + "end": { + "line": 43, + "column": 47 + } + } + }, + "loc": { + "start": { + "line": 43, + "column": 11 + }, + "end": { + "line": 43, + "column": 47 + } + } + } + ], + "kind": "const", + "loc": { + "start": { + "line": 43, + "column": 5 + }, + "end": { + "line": 43, + "column": 47 + } + } + }, + { + "type": "VariableDeclaration", + "declarations": [ + { + "type": "VariableDeclarator", + "id": { + "type": "Identifier", + "name": "o2", + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O2", + "decorators": [], + "loc": { + "start": { + "line": 44, + "column": 15 + }, + "end": { + "line": 44, + "column": 17 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "TSArrayType", + "elementType": { + "type": "ETSWildcardType", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Object", + "decorators": [], + "loc": { + "start": { + "line": 44, + "column": 21 + }, + "end": { + "line": 44, + "column": 27 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 21 + }, + "end": { + "line": 44, + "column": 28 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 21 + }, + "end": { + "line": 44, + "column": 28 + } + } + }, + "in": true, + "loc": { + "start": { + "line": 44, + "column": 18 + }, + "end": { + "line": 44, + "column": 28 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 29 + }, + "end": { + "line": 44, + "column": 30 + } + } + } + ], + "loc": { + "start": { + "line": 44, + "column": 17 + }, + "end": { + "line": 44, + "column": 30 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 15 + }, + "end": { + "line": 44, + "column": 32 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 15 + }, + "end": { + "line": 44, + "column": 32 + } + } + }, + "decorators": [], + "loc": { + "start": { + "line": 44, + "column": 11 + }, + "end": { + "line": 44, + "column": 13 + } + } + }, + "init": { + "type": "ETSNewClassInstanceExpression", + "typeReference": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "O2", + "decorators": [], + "loc": { + "start": { + "line": 44, + "column": 37 + }, + "end": { + "line": 44, + "column": 39 + } + } + }, + "typeParams": { + "type": "TSTypeParameterInstantiation", + "params": [ + { + "type": "TSArrayType", + "elementType": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "Object", + "decorators": [], + "loc": { + "start": { + "line": 44, + "column": 40 + }, + "end": { + "line": 44, + "column": 46 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 40 + }, + "end": { + "line": 44, + "column": 47 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 40 + }, + "end": { + "line": 44, + "column": 47 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 48 + }, + "end": { + "line": 44, + "column": 49 + } + } + } + ], + "loc": { + "start": { + "line": 44, + "column": 39 + }, + "end": { + "line": 44, + "column": 49 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 37 + }, + "end": { + "line": 44, + "column": 50 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 37 + }, + "end": { + "line": 44, + "column": 50 + } + } + }, + "arguments": [], + "loc": { + "start": { + "line": 44, + "column": 33 + }, + "end": { + "line": 44, + "column": 52 + } + } + }, + "loc": { + "start": { + "line": 44, + "column": 11 + }, + "end": { + "line": 44, + "column": 52 + } + } + } + ], + "kind": "const", + "loc": { + "start": { + "line": 44, + "column": 5 + }, + "end": { + "line": 44, + "column": 52 + } + } + } + ], + "loc": { + "start": { + "line": 42, + "column": 23 + }, + "end": { + "line": 45, + "column": 2 + } + } + }, + "loc": { + "start": { + "line": 42, + "column": 14 + }, + "end": { + "line": 45, + "column": 2 + } + } + }, + "loc": { + "start": { + "line": 42, + "column": 14 + }, + "end": { + "line": 45, + "column": 2 + } + } + }, + "overloads": [], + "decorators": [], + "loc": { + "start": { + "line": 42, + "column": 1 + }, + "end": { + "line": 45, + "column": 2 + } + } + } + ], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + } + ], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 46, + "column": 1 + } + } +} diff --git a/test/parser/ets/type_variance1.ets b/test/parser/ets/type_variance1.ets new file mode 100644 index 000000000..208a215a0 --- /dev/null +++ b/test/parser/ets/type_variance1.ets @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class C { + set(_: T): void {} +} + +const C_GLOBAL: C = new C(); + +interface Declaration_Site_I { + set(_: In_T): void; + get(): Out_T; +} + +interface Use_Site_I { + set(_: In_T): void; + get(): Out_T; +} + +class O {} + +class Declaration_Site_C implements Declaration_Site_I {} + +class Use_Site_C implements Use_Site_I {} + +class Outbounded_Use_Site_C implements Use_Site_I {} + +class O2 {} + +function test(): void { + const o: O2 = new O2(); + const o2: O2 = new O2(); +} diff --git a/test/parser/ets/type_variance2-expected.txt b/test/parser/ets/type_variance2-expected.txt new file mode 100644 index 000000000..13712ea82 --- /dev/null +++ b/test/parser/ets/type_variance2-expected.txt @@ -0,0 +1 @@ +SyntaxError: Variance modifier is not allowed here. [type_variance2.ets:17:15] diff --git a/test/parser/ets/type_variance2.ets b/test/parser/ets/type_variance2.ets new file mode 100644 index 000000000..b7066130f --- /dev/null +++ b/test/parser/ets/type_variance2.ets @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class C { + constructor() {} +} diff --git a/test/parser/ets/type_variance3-expected.txt b/test/parser/ets/type_variance3-expected.txt new file mode 100644 index 000000000..307d2d822 --- /dev/null +++ b/test/parser/ets/type_variance3-expected.txt @@ -0,0 +1 @@ +SyntaxError: Variance modifier is not allowed here. [type_variance3.ets:17:7] diff --git a/test/parser/ets/type_variance3.ets b/test/parser/ets/type_variance3.ets new file mode 100644 index 000000000..ffb011318 --- /dev/null +++ b/test/parser/ets/type_variance3.ets @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class C { + set(t: T2): void { } +} diff --git a/test/parser/ets/type_variance4-expected.txt b/test/parser/ets/type_variance4-expected.txt new file mode 100644 index 000000000..8b9967672 --- /dev/null +++ b/test/parser/ets/type_variance4-expected.txt @@ -0,0 +1 @@ +SyntaxError: Unexpected token, expected: '('. [type_variance4.ets:18:12] diff --git a/test/parser/ets/type_variance4.ets b/test/parser/ets/type_variance4.ets new file mode 100644 index 000000000..0155a55be --- /dev/null +++ b/test/parser/ets/type_variance4.ets @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// TODO: Should be a "SyntaxError: Variance modifier is not allowed here [type_variance4.ets:18:13]", +// after generic global function parsing is implemented. +function fn(t: T): void {} -- Gitee From 1c553e0447f5b4c2a9ed2a229e5aa8b61997c573 Mon Sep 17 00:00:00 2001 From: Otto Eotvos Date: Thu, 1 Dec 2022 13:09:42 +0100 Subject: [PATCH 05/13] Added a basic solution to resolve circular type alias references Signed-off-by: Otto Eotvos --- checker/ets/helpers.cpp | 5 +- .../parser/ets/test_type_alias10-expected.txt | 197 ++++++++++++++++++ test/parser/ets/test_type_alias10.ets | 17 ++ 3 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 test/parser/ets/test_type_alias10-expected.txt create mode 100644 test/parser/ets/test_type_alias10.ets diff --git a/checker/ets/helpers.cpp b/checker/ets/helpers.cpp index 9bdff68ab..b5845116d 100644 --- a/checker/ets/helpers.cpp +++ b/checker/ets/helpers.cpp @@ -509,7 +509,10 @@ Type *ETSChecker::GetTypeFromTypeAliasReference(binder::Variable *var) return var->TsType(); } - auto *aliasedType = var->Declaration()->Node()->AsTSTypeAliasDeclaration()->TypeAnnotation()->GetType(this); + auto aliasTypeNode = var->Declaration()->Node()->AsTSTypeAliasDeclaration(); + TypeStackElement tse(this, aliasTypeNode, "Circular type alias reference", aliasTypeNode->Start()); + auto *aliasedType = aliasTypeNode->TypeAnnotation()->GetType(this); + var->SetTsType(aliasedType); return aliasedType; } diff --git a/test/parser/ets/test_type_alias10-expected.txt b/test/parser/ets/test_type_alias10-expected.txt new file mode 100644 index 000000000..1179a20b1 --- /dev/null +++ b/test/parser/ets/test_type_alias10-expected.txt @@ -0,0 +1,197 @@ +{ + "type": "Program", + "statements": [ + { + "type": "TSTypeAliasDeclaration", + "id": { + "type": "Identifier", + "name": "firstType", + "decorators": [], + "loc": { + "start": { + "line": 16, + "column": 6 + }, + "end": { + "line": 16, + "column": 15 + } + } + }, + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "secondType", + "decorators": [], + "loc": { + "start": { + "line": 16, + "column": 18 + }, + "end": { + "line": 16, + "column": 28 + } + } + }, + "loc": { + "start": { + "line": 16, + "column": 18 + }, + "end": { + "line": 16, + "column": 29 + } + } + }, + "loc": { + "start": { + "line": 16, + "column": 18 + }, + "end": { + "line": 16, + "column": 29 + } + } + }, + "loc": { + "start": { + "line": 16, + "column": 1 + }, + "end": { + "line": 16, + "column": 29 + } + } + }, + { + "type": "TSTypeAliasDeclaration", + "id": { + "type": "Identifier", + "name": "secondType", + "decorators": [], + "loc": { + "start": { + "line": 17, + "column": 6 + }, + "end": { + "line": 17, + "column": 16 + } + } + }, + "typeAnnotation": { + "type": "ETSTypeReference", + "part": { + "type": "ETSTypeReferencePart", + "name": { + "type": "Identifier", + "name": "firstType", + "decorators": [], + "loc": { + "start": { + "line": 17, + "column": 19 + }, + "end": { + "line": 17, + "column": 28 + } + } + }, + "loc": { + "start": { + "line": 17, + "column": 19 + }, + "end": { + "line": 17, + "column": 29 + } + } + }, + "loc": { + "start": { + "line": 17, + "column": 19 + }, + "end": { + "line": 17, + "column": 29 + } + } + }, + "loc": { + "start": { + "line": 17, + "column": 1 + }, + "end": { + "line": 17, + "column": 29 + } + } + }, + { + "type": "ClassDeclaration", + "definition": { + "id": { + "type": "Identifier", + "name": "ETSGLOBAL", + "decorators": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "superClass": null, + "implements": [], + "body": [], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + }, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 1 + } + } + } + ], + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 18, + "column": 1 + } + } +} +TypeError: Circular type alias reference [test_type_alias10.ets:17:1] diff --git a/test/parser/ets/test_type_alias10.ets b/test/parser/ets/test_type_alias10.ets new file mode 100644 index 000000000..cf1e242a7 --- /dev/null +++ b/test/parser/ets/test_type_alias10.ets @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +type firstType = secondType; +type secondType = firstType; -- Gitee From bf36c8350e67f465ba691ea3ac7aa7ecc4243cc3 Mon Sep 17 00:00:00 2001 From: Daniel Szucs Date: Fri, 25 Nov 2022 16:00:59 +0100 Subject: [PATCH 06/13] Fix invalid byte code generation with more than 16 registers Change-Id: Ia959d24f56f36529ee6deb372ae8eb04246fece7 Signed-off-by: Daniel Szucs --- compiler/core/ETSGen.cpp | 190 ++++++++++-------- compiler/core/ETSGen.h | 85 ++++---- compiler/core/codeGen.h | 35 +++- compiler/core/regAllocator.cpp | 36 ++-- compiler/core/regAllocator.h | 17 +- compiler/core/regScope.cpp | 4 +- compiler/core/regSpiller.cpp | 117 ++++++++--- compiler/core/regSpiller.h | 52 ++--- compiler/core/switchBuilder.h | 2 +- compiler/core/vReg.h | 23 +-- ir/ets/etsClassLiteral.cpp | 2 +- ir/ets/etsMethodReferenceExpression.cpp | 2 +- ir/ets/etsNewClassInstanceExpression.cpp | 2 +- .../etsNewMultiDimArrayInstanceExpression.cpp | 2 +- ir/expressions/callExpression.cpp | 2 +- ir/statements/panicStatement.cpp | 2 +- ir/ts/tsAsExpression.cpp | 2 +- test/runtime/ets/LongLiteralLimits.ets | 15 ++ test/runtime/ets/RegisterSpiller.ets | 44 ++++ 19 files changed, 377 insertions(+), 257 deletions(-) create mode 100644 test/runtime/ets/RegisterSpiller.ets diff --git a/compiler/core/ETSGen.cpp b/compiler/core/ETSGen.cpp index 8226e9740..31787b6ff 100644 --- a/compiler/core/ETSGen.cpp +++ b/compiler/core/ETSGen.cpp @@ -37,6 +37,16 @@ namespace panda::es2panda::compiler { +void ETSGen::SetAccumulatorType(const checker::Type *type) +{ + SetVRegType(acc_, type); +} + +const checker::Type *ETSGen::GetAccumulatorType() const +{ + return GetVRegType(acc_); +} + const checker::ETSChecker *ETSGen::Checker() const { return Context()->Checker()->AsETSChecker(); @@ -58,48 +68,51 @@ VReg ETSGen::StoreException(const ir::AstNode *node) VReg exception = AllocReg(); Ra().Emit(node, exception); - acc_.SetType(Checker()->GlobalBuiltinExceptionType()); - exception.SetType(acc_.GetType()); + SetAccumulatorType(Checker()->GlobalBuiltinExceptionType()); + SetVRegType(exception, GetAccumulatorType()); return exception; } void ETSGen::StoreAccumulator(const ir::AstNode *node, VReg &vreg) { - if (acc_.GetType()->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + const auto *accType = GetAccumulatorType(); + if (accType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { Ra().Emit(node, vreg); - } else if (acc_.GetType()->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { + } else if (accType->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { Ra().Emit(node, vreg); } else { Ra().Emit(node, vreg); } - vreg.SetType(acc_.GetType()); + SetVRegType(vreg, accType); } void ETSGen::LoadAccumulator(const ir::AstNode *node, VReg vreg) { - if (vreg.GetType()->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + const auto *vregType = GetVRegType(vreg); + if (vregType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { Ra().Emit(node, vreg); - } else if (vreg.GetType()->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { + } else if (vregType->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { Ra().Emit(node, vreg); } else { Ra().Emit(node, vreg); } - acc_.SetType(vreg.GetType()); + SetAccumulatorType(vregType); } void ETSGen::MoveVreg(const ir::AstNode *node, VReg &vd, VReg vs) { - if (vs.GetType()->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + const auto *sourceType = GetVRegType(vs); + if (sourceType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { Ra().Emit(node, vd, vs); - } else if (vs.GetType()->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { + } else if (sourceType->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { Ra().Emit(node, vd, vs); } else { Ra().Emit(node, vd, vs); } - vd.SetType(vs.GetType()); + SetVRegType(vd, sourceType); } void ETSGen::LoadVar(const ir::AstNode *node, binder::Variable *var) @@ -120,7 +133,7 @@ void ETSGen::LoadVar(const ir::AstNode *node, binder::Variable *var) case ReferenceKind::STATIC_METHOD: case ReferenceKind::CLASS: case ReferenceKind::STATIC_CLASS: { - acc_.SetType(var->TsType()); + SetAccumulatorType(var->TsType()); break; } case ReferenceKind::LOCAL: { @@ -207,13 +220,13 @@ void ETSGen::LoadStaticProperty(const ir::AstNode *node, const checker::Type *pr Sa().Emit(node, fullName); } - acc_.SetType(propType); + SetAccumulatorType(propType); } void ETSGen::StoreProperty(const ir::AstNode *node, const checker::Type *propType, VReg objReg, const util::StringView &name) { - util::StringView fullName = FormClassPropReference(objReg.GetType()->AsETSObjectType(), name); + util::StringView fullName = FormClassPropReference(GetVRegType(objReg)->AsETSObjectType(), name); if (propType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { Ra().Emit(node, objReg, fullName); @@ -227,7 +240,7 @@ void ETSGen::StoreProperty(const ir::AstNode *node, const checker::Type *propTyp void ETSGen::LoadProperty(const ir::AstNode *node, const checker::Type *propType, VReg objReg, const util::StringView &name) { - util::StringView fullName = FormClassPropReference(objReg.GetType()->AsETSObjectType(), name); + util::StringView fullName = FormClassPropReference(GetVRegType(objReg)->AsETSObjectType(), name); if (propType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { Ra().Emit(node, objReg, fullName); @@ -237,7 +250,7 @@ void ETSGen::LoadProperty(const ir::AstNode *node, const checker::Type *propType Ra().Emit(node, objReg, fullName); } - acc_.SetType(propType); + SetAccumulatorType(propType); } void ETSGen::LoadThis(const ir::AstNode *node) @@ -270,9 +283,10 @@ void ETSGen::EmitReturnVoid(const ir::AstNode *node) void ETSGen::ReturnAcc(const ir::AstNode *node) { - if (acc_.GetType()->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + const auto *accType = GetAccumulatorType(); + if (accType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { Sa().Emit(node); - } else if (acc_.GetType()->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { + } else if (accType->HasTypeFlag(checker::TypeFlag::ETS_WIDE_NUMERIC)) { Sa().Emit(node); } else { Sa().Emit(node); @@ -340,7 +354,7 @@ void ETSGen::ApplyConversion(const ir::AstNode *node, const checker::Type *targe auto typeKind = checker::ETSChecker::TypeKind(targetType); - auto sourceType = acc_.GetType(); + const auto *sourceType = GetAccumulatorType(); if (sourceType->IsETSObjectType() && sourceType->AsETSObjectType()->HasObjectFlag(checker::ETSObjectFlags::UNBOXABLE_TYPE) && @@ -377,45 +391,46 @@ void ETSGen::ApplyConversion(const ir::AstNode *node, const checker::Type *targe void ETSGen::EmitUnboxingConversion(const ir::AstNode *node, const checker::Type *targetType, checker::TypeFlag typeKind) { + RegScope rs(this); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: { - Ra().Emit(node, Signatures::BUILTIN_BOOLEAN_BOOLEAN_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_BOOLEAN_BOOLEAN_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::BYTE: { - Ra().Emit(node, Signatures::BUILTIN_BYTE_BYTE_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_BYTE_BYTE_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::CHAR: { - Ra().Emit(node, Signatures::BUILTIN_CHAR_CHAR_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_CHAR_CHAR_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::SHORT: { - Ra().Emit(node, Signatures::BUILTIN_SHORT_SHORT_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_SHORT_SHORT_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::INT: { - Ra().Emit(node, Signatures::BUILTIN_INT_INT_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_INT_INT_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::LONG: { - Ra().Emit(node, Signatures::BUILTIN_LONG_LONG_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_LONG_LONG_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::FLOAT: { - Ra().Emit(node, Signatures::BUILTIN_FLOAT_FLOAT_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_FLOAT_FLOAT_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::DOUBLE: { - Ra().Emit(node, Signatures::BUILTIN_DOUBLE_DOUBLE_VALUE, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_DOUBLE_DOUBLE_VALUE, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } default: { @@ -427,46 +442,47 @@ void ETSGen::EmitUnboxingConversion(const ir::AstNode *node, const checker::Type void ETSGen::EmitBoxingConversion(const ir::AstNode *node, const checker::Type *targetType, const checker::Type *sourceType) { + RegScope rs(this); auto sourceTypeKind = checker::ETSChecker::TypeKind(sourceType); switch (sourceTypeKind) { case checker::TypeFlag::ETS_BOOLEAN: { - Ra().Emit(node, Signatures::BUILTIN_BOOLEAN_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_BOOLEAN_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::BYTE: { - Ra().Emit(node, Signatures::BUILTIN_BYTE_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_BYTE_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::CHAR: { - Ra().Emit(node, Signatures::BUILTIN_CHAR_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_CHAR_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::SHORT: { - Ra().Emit(node, Signatures::BUILTIN_SHORT_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_SHORT_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::INT: { - Ra().Emit(node, Signatures::BUILTIN_INT_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_INT_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::LONG: { - Ra().Emit(node, Signatures::BUILTIN_LONG_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_LONG_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::FLOAT: { - Ra().Emit(node, Signatures::BUILTIN_FLOAT_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_FLOAT_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } case checker::TypeFlag::DOUBLE: { - Ra().Emit(node, Signatures::BUILTIN_DOUBLE_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType); + Ra().Emit(node, Signatures::BUILTIN_DOUBLE_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType); break; } default: { @@ -487,7 +503,7 @@ void ETSGen::SwapBinaryOpArgs(const ir::AstNode *node, VReg &lhs) void ETSGen::CastToBoolean([[maybe_unused]] const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: @@ -516,12 +532,12 @@ void ETSGen::CastToBoolean([[maybe_unused]] const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); } void ETSGen::CastToByte([[maybe_unused]] const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: { @@ -553,12 +569,12 @@ void ETSGen::CastToByte([[maybe_unused]] const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalByteType()); + SetAccumulatorType(Checker()->GlobalByteType()); } void ETSGen::CastToChar([[maybe_unused]] const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: @@ -591,12 +607,12 @@ void ETSGen::CastToChar([[maybe_unused]] const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalCharType()); + SetAccumulatorType(Checker()->GlobalCharType()); } void ETSGen::CastToShort([[maybe_unused]] const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: @@ -628,12 +644,12 @@ void ETSGen::CastToShort([[maybe_unused]] const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalShortType()); + SetAccumulatorType(Checker()->GlobalShortType()); } void ETSGen::CastToDouble(const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: @@ -659,12 +675,12 @@ void ETSGen::CastToDouble(const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalDoubleType()); + SetAccumulatorType(Checker()->GlobalDoubleType()); } void ETSGen::CastToFloat(const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: @@ -690,12 +706,12 @@ void ETSGen::CastToFloat(const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalFloatType()); + SetAccumulatorType(Checker()->GlobalFloatType()); } void ETSGen::CastToLong(const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: @@ -721,12 +737,12 @@ void ETSGen::CastToLong(const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalLongType()); + SetAccumulatorType(Checker()->GlobalLongType()); } void ETSGen::CastToInt(const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: @@ -752,7 +768,7 @@ void ETSGen::CastToInt(const ir::AstNode *node) } } - acc_.SetType(Checker()->GlobalIntType()); + SetAccumulatorType(Checker()->GlobalIntType()); } void ETSGen::ToBinaryResult(const ir::AstNode *node, Label *ifFalse) @@ -865,7 +881,7 @@ void ETSGen::Binary(const ir::AstNode *node, lexer::TokenType op, VReg lhs) } case lexer::TokenType::KEYW_INSTANCEOF: { SwapBinaryOpArgs(node, lhs); - IsInstance(node, lhs.GetType()->AsETSObjectType()->AssemblerName()); + IsInstance(node, GetVRegType(lhs)->AsETSObjectType()->AssemblerName()); break; } default: { @@ -905,9 +921,9 @@ void ETSGen::Condition(const ir::AstNode *node, lexer::TokenType op, VReg lhs, L } case lexer::TokenType::KEYW_INSTANCEOF: { SwapBinaryOpArgs(node, lhs); - Sa().Emit(node, lhs.GetType()->AsETSObjectType()->AssemblerName()); + Sa().Emit(node, GetVRegType(lhs)->AsETSObjectType()->AssemblerName()); BranchIfFalse(node, ifFalse); - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); break; } default: { @@ -970,7 +986,7 @@ void ETSGen::CompileStatementList(const ArenaVector &statements void ETSGen::Negate(const ir::AstNode *node) { - auto typeKind = checker::ETSChecker::TypeKind(acc_.GetType()); + auto typeKind = checker::ETSChecker::TypeKind(GetAccumulatorType()); switch (typeKind) { case checker::TypeFlag::BYTE: @@ -1000,7 +1016,7 @@ void ETSGen::Negate(const ir::AstNode *node) void ETSGen::LogicalNot(const ir::AstNode *node) { - ASSERT(acc_.GetType()->IsETSBooleanType()); + ASSERT(GetAccumulatorType()->IsETSBooleanType()); Sa().Emit(node); Sa().Emit(node, 1); } @@ -1031,7 +1047,7 @@ void ETSGen::Unary(const ir::AstNode *node, lexer::TokenType op) void ETSGen::UnaryMinus(const ir::AstNode *node) { - switch (checker::ETSChecker::ETSType(acc_.GetType())) { + switch (checker::ETSChecker::ETSType(GetAccumulatorType())) { case checker::TypeFlag::LONG: { Sa().Emit(node); break; @@ -1059,7 +1075,7 @@ void ETSGen::UnaryMinus(const ir::AstNode *node) void ETSGen::UnaryTilde(const ir::AstNode *node) { - switch (checker::ETSChecker::ETSType(acc_.GetType())) { + switch (checker::ETSChecker::ETSType(GetAccumulatorType())) { case checker::TypeFlag::LONG: { Sa().Emit(node); break; @@ -1101,7 +1117,7 @@ void ETSGen::StringBuilderAppend(const ir::AstNode *node, VReg builder) node->Compile(this); - switch (checker::ETSChecker::ETSType(acc_.GetType())) { + switch (checker::ETSChecker::ETSType(GetAccumulatorType())) { case checker::TypeFlag::ETS_BOOLEAN: { signature = Signatures::BUILTIN_STRING_BUILDER_APPEND_BOOLEAN; break; @@ -1134,14 +1150,15 @@ void ETSGen::StringBuilderAppend(const ir::AstNode *node, VReg builder) } } - if (acc_.GetType()->IsETSObjectType() && !acc_.GetType()->IsETSStringType()) { - Ra().Emit(node, Signatures::BUILTIN_OBJECT_TO_STRING, VReg::RegStart(), 0); + if (GetAccumulatorType()->IsETSObjectType() && !GetAccumulatorType()->IsETSStringType()) { + Ra().Emit(node, Signatures::BUILTIN_OBJECT_TO_STRING, DUMMY_REG, 0); } VReg arg0 = AllocReg(); StoreAccumulator(node, arg0); CallThisStatic1(node, builder, signature, arg0); + SetAccumulatorType(Checker()->GetGlobalTypesHolder()->GlobalStringBuilderBuiltinType()); } void ETSGen::AppendString(const ir::Expression *expr, VReg &builder) @@ -1172,16 +1189,17 @@ void ETSGen::StringBuilder(const ir::Expression *left, const ir::Expression *rig void ETSGen::BuildString(const ir::Expression *node) { RegScope rs(this); - VReg builder = AllocReg(); - Sa().Emit(node, Signatures::BUILTIN_STRING_BUILDER_CTOR, VReg::RegStart(), VReg::RegStart()); - acc_.SetType(Checker()->GlobalStringBuilderBuiltinType()); + Ra().Emit(node, Signatures::BUILTIN_STRING_BUILDER_CTOR, DUMMY_REG, DUMMY_REG); + SetAccumulatorType(Checker()->GlobalStringBuilderBuiltinType()); + + auto builder = AllocReg(); StoreAccumulator(node, builder); AppendString(node, builder); CallThisStatic0(node, builder, Signatures::BUILTIN_STRING_BUILDER_TO_STRING); - acc_.SetType(Checker()->GlobalETSStringLiteralType()); + SetAccumulatorType(Checker()->GlobalBuiltinETSStringType()); } void ETSGen::NewObject(const ir::AstNode *node, VReg &ctor, util::StringView name) @@ -1201,12 +1219,12 @@ void ETSGen::NewArray(const ir::AstNode *node, VReg &arr, VReg dim, const checke void ETSGen::LoadArrayLength(const ir::AstNode *node, VReg arrayReg) { Ra().Emit(node, arrayReg); - acc_.SetType(Checker()->GlobalIntType()); + SetAccumulatorType(Checker()->GlobalIntType()); } void ETSGen::LoadArrayElement(const ir::AstNode *node, VReg objectReg) { - auto *elementType = objectReg.GetType()->AsETSArrayType()->ElementType(); + auto *elementType = GetVRegType(objectReg)->AsETSArrayType()->ElementType(); switch (checker::ETSChecker::ETSType(elementType)) { case checker::TypeFlag::BYTE: { @@ -1246,12 +1264,12 @@ void ETSGen::LoadArrayElement(const ir::AstNode *node, VReg objectReg) } } - acc_.SetType(elementType); + SetAccumulatorType(elementType); } void ETSGen::StoreArrayElement(const ir::AstNode *node, VReg objectReg, VReg index) { - auto *elementType = objectReg.GetType()->AsETSArrayType()->ElementType(); + auto *elementType = GetVRegType(objectReg)->AsETSArrayType()->ElementType(); switch (checker::ETSChecker::ETSType(elementType)) { case checker::TypeFlag::BYTE: { @@ -1291,7 +1309,7 @@ void ETSGen::StoreArrayElement(const ir::AstNode *node, VReg objectReg, VReg ind } } - acc_.SetType(elementType); + SetAccumulatorType(elementType); } void ETSGen::ThrowException(const ir::Expression *expr) diff --git a/compiler/core/ETSGen.h b/compiler/core/ETSGen.h index 43f72693f..a3e7cd24e 100644 --- a/compiler/core/ETSGen.h +++ b/compiler/core/ETSGen.h @@ -54,6 +54,9 @@ public: return acc_; } + void SetAccumulatorType(const checker::Type *type); + const checker::Type *GetAccumulatorType() const; + VReg StoreException(const ir::AstNode *node); void ApplyConversionAndStoreAccumulator(const ir::AstNode *node, VReg &vreg, const checker::Type *targetType); void StoreAccumulator(const ir::AstNode *node, VReg &vreg); @@ -84,7 +87,7 @@ public: void IsInstance(const ir::AstNode *node, util::StringView name) { Sa().Emit(node, name); - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); } void Binary(const ir::AstNode *node, lexer::TokenType op, VReg lhs); @@ -153,23 +156,23 @@ public: Sa().Emit(node, value ? 1 : 0); if (typeKind == checker::TypeFlag::ETS_OBJECT && targetType_->AsETSObjectType()->HasObjectFlag(checker::ETSObjectFlags::BUILTIN_BOOLEAN)) { - Ra().Emit(node, Signatures::BUILTIN_BOOLEAN_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType_); + Ra().Emit(node, Signatures::BUILTIN_BOOLEAN_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType_); } else { - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); } } void LoadAccumulatorString(const ir::AstNode *node, util::StringView str) { Sa().Emit(node, str); - acc_.SetType(Checker()->GlobalETSStringLiteralType()); + SetAccumulatorType(Checker()->GlobalETSStringLiteralType()); } void LoadAccumulatorNull(const ir::AstNode *node, const checker::Type *type) { Sa().Emit(node); - acc_.SetType(type); + SetAccumulatorType(type); } void LoadAccumulatorChar(const ir::AstNode *node, char16_t value) @@ -178,10 +181,10 @@ public: Sa().Emit(node, value); if (typeKind == checker::TypeFlag::ETS_OBJECT && targetType_->AsETSObjectType()->HasObjectFlag(checker::ETSObjectFlags::BUILTIN_CHAR)) { - Ra().Emit(node, Signatures::BUILTIN_CHAR_VALUE_OF, VReg::RegStart(), 0); - acc_.SetType(targetType_); + Ra().Emit(node, Signatures::BUILTIN_CHAR_VALUE_OF, DUMMY_REG, 0); + SetAccumulatorType(targetType_); } else { - acc_.SetType(Checker()->GlobalCharType()); + SetAccumulatorType(Checker()->GlobalCharType()); } } @@ -243,7 +246,7 @@ public: void CallThisStatic0(const ir::AstNode *node, VReg &ctor, util::StringView name) { - Ra().Emit(node, name, ctor, VReg::RegStart()); + Ra().Emit(node, name, ctor, DUMMY_REG); } void CallThisStatic1(const ir::AstNode *node, VReg &ctor, util::StringView name, VReg &arg0) @@ -253,7 +256,7 @@ public: void CallThisStatic2(const ir::AstNode *node, VReg &ctor, util::StringView name, VReg &arg0, VReg &arg1) { - Ra().Emit(node, name, ctor, arg0, arg1, VReg::RegStart()); + Ra().Emit(node, name, ctor, arg0, arg1, DUMMY_REG); } void GetType(const ir::AstNode *node, bool isETSPrimitive) @@ -261,7 +264,7 @@ public: if (isETSPrimitive) { // TODO(SzD) LoadStaticProperty if ETS stdlib has static TYPE constants otherwise fallback to LdaType } else { - auto classRef = acc_.GetType()->AsETSObjectType()->AssemblerName(); + auto classRef = GetAccumulatorType()->AsETSObjectType()->AssemblerName(); Sa().Emit(node, classRef); } } @@ -271,6 +274,8 @@ public: NO_MOVE_SEMANTIC(ETSGen); private: + const VReg DUMMY_REG = VReg::RegStart(); + void StringBuilderAppend(const ir::AstNode *node, VReg builder); void AppendString(const ir::Expression *binExpr, VReg &builder); void StringBuilder(const ir::Expression *left, const ir::Expression *right, VReg &builder); @@ -289,7 +294,7 @@ private: template void UpdateOperator(const ir::AstNode *node) { - switch (checker::ETSChecker::ETSType(acc_.GetType())) { + switch (checker::ETSChecker::ETSType(GetAccumulatorType())) { case checker::TypeFlag::LONG: { RegScope scope(this); VReg reg = AllocReg(); @@ -342,7 +347,7 @@ private: { BinaryEqualityCondition(node, lhs, ifFalse); ToBinaryResult(node, ifFalse); - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); } template @@ -352,13 +357,13 @@ private: switch (typeKind) { case checker::TypeFlag::ETS_OBJECT: { - ASSERT(lhs.GetType()->IsETSObjectType()); - if (lhs.GetType()->IsETSStringType()) { + ASSERT(GetVRegType(lhs)->IsETSObjectType()); + if (GetVRegType(lhs)->IsETSStringType()) { RegScope rs(this); VReg arg0 = AllocReg(); StoreAccumulator(node, arg0); CallThisStatic1(node, lhs, Signatures::BUILTIN_STRING_EQUALS, arg0); - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); if constexpr (std::is_same_v) { LogicalNot(node); } @@ -395,7 +400,7 @@ private: } } - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); } template @@ -403,7 +408,7 @@ private: { BinaryRelationCondition(node, lhs, ifFalse); ToBinaryResult(node, ifFalse); - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); } template @@ -436,7 +441,7 @@ private: } } - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); } template @@ -447,12 +452,12 @@ private: switch (typeKind) { case checker::TypeFlag::DOUBLE: { Ra().Emit(node, lhs); - acc_.SetType(Checker()->GlobalDoubleType()); + SetAccumulatorType(Checker()->GlobalDoubleType()); break; } case checker::TypeFlag::FLOAT: { Ra().Emit(node, lhs); - acc_.SetType(Checker()->GlobalFloatType()); + SetAccumulatorType(Checker()->GlobalFloatType()); break; } default: { @@ -469,19 +474,19 @@ private: switch (typeKind) { case checker::TypeFlag::LONG: { Ra().Emit(node, lhs); - acc_.SetType(Checker()->GlobalLongType()); + SetAccumulatorType(Checker()->GlobalLongType()); break; } case checker::TypeFlag::BYTE: case checker::TypeFlag::SHORT: case checker::TypeFlag::INT: { Ra().Emit(node, lhs); - acc_.SetType(Checker()->GlobalIntType()); + SetAccumulatorType(Checker()->GlobalIntType()); break; } case checker::TypeFlag::ETS_BOOLEAN: { Ra().Emit(node, lhs); - acc_.SetType(Checker()->GlobalETSBooleanType()); + SetAccumulatorType(Checker()->GlobalETSBooleanType()); break; } default: { @@ -503,11 +508,11 @@ private: const ArenaVector &arguments) { RegScope rs(this); - util::StringView name = signature->InternalName(); + const auto name = signature->InternalName(); switch (arguments.size()) { case 0: { - Ra().Emit(node, name, ctor, VReg::RegStart()); + Ra().Emit(node, name, ctor, DUMMY_REG); break; } case 1: { @@ -518,7 +523,7 @@ private: case 2: { COMPILE_ARG(0); COMPILE_ARG(1); - Ra().Emit(node, name, ctor, arg0, arg1, VReg::RegStart()); + Ra().Emit(node, name, ctor, arg0, arg1, DUMMY_REG); break; } case 3: { @@ -547,16 +552,16 @@ private: const ArenaVector &arguments) { RegScope rs(this); - util::StringView name = signature->InternalName(); + const auto name = signature->InternalName(); switch (arguments.size()) { case 0: { - Ra().Emit(node, name, VReg::RegStart(), VReg::RegStart()); + Ra().Emit(node, name, DUMMY_REG, DUMMY_REG); break; } case 1: { COMPILE_ARG(0); - Ra().Emit(node, name, arg0, VReg::RegStart()); + Ra().Emit(node, name, arg0, DUMMY_REG); break; } case 2: { @@ -569,7 +574,7 @@ private: COMPILE_ARG(0); COMPILE_ARG(1); COMPILE_ARG(2); - Ra().Emit(node, name, arg0, arg1, arg2, VReg::RegStart()); + Ra().Emit(node, name, arg0, arg1, arg2, DUMMY_REG); break; } case 4: { @@ -621,37 +626,37 @@ void ETSGen::LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::T switch (typeKind) { case checker::TypeFlag::BYTE: { Sa().Emit(node, static_cast(number)); - acc_.SetType(Checker()->GlobalByteType()); + SetAccumulatorType(Checker()->GlobalByteType()); break; } case checker::TypeFlag::CHAR: { Sa().Emit(node, static_cast(number)); - acc_.SetType(Checker()->GlobalCharType()); + SetAccumulatorType(Checker()->GlobalCharType()); break; } case checker::TypeFlag::SHORT: { Sa().Emit(node, static_cast(number)); - acc_.SetType(Checker()->GlobalShortType()); + SetAccumulatorType(Checker()->GlobalShortType()); break; } case checker::TypeFlag::INT: { Sa().Emit(node, static_cast(number)); - acc_.SetType(Checker()->GlobalIntType()); + SetAccumulatorType(Checker()->GlobalIntType()); break; } case checker::TypeFlag::LONG: { Sa().Emit(node, static_cast(number)); - acc_.SetType(Checker()->GlobalLongType()); + SetAccumulatorType(Checker()->GlobalLongType()); break; } case checker::TypeFlag::FLOAT: { Sa().Emit(node, static_cast(number)); - acc_.SetType(Checker()->GlobalFloatType()); + SetAccumulatorType(Checker()->GlobalFloatType()); break; } case checker::TypeFlag::DOUBLE: { Sa().Emit(node, static_cast(number)); - acc_.SetType(Checker()->GlobalDoubleType()); + SetAccumulatorType(Checker()->GlobalDoubleType()); break; } default: { @@ -661,7 +666,7 @@ void ETSGen::LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::T if (targetType_ && targetType_->IsETSObjectType()) { ApplyConversion(node, targetType_); - acc_.SetType(targetType_); + SetAccumulatorType(targetType_); } } diff --git a/compiler/core/codeGen.h b/compiler/core/codeGen.h index e56b67fe1..e3dec74db 100644 --- a/compiler/core/codeGen.h +++ b/compiler/core/codeGen.h @@ -67,6 +67,8 @@ private: class CodeGen { public: + using TypeMap = ArenaUnorderedMap; + explicit CodeGen(ArenaAllocator *allocator, RegSpiller *spiller, CompilerContext *context, binder::FunctionScope *scope, ProgramElement *programElement) : allocator_(allocator), @@ -77,6 +79,7 @@ public: rootNode_(scope->Node()), insns_(allocator_->Adapter()), catchList_(allocator_->Adapter()), + typeMap_(allocator_->Adapter()), programElement_(programElement), sa_(this), ra_(this, spiller), @@ -112,12 +115,12 @@ public: return rootNode_; } - ArenaList &Insns() + ArenaVector &Insns() { return insns_; } - const ArenaList &Insns() const + const ArenaVector &Insns() const { return insns_; } @@ -129,7 +132,9 @@ public: VReg AllocReg(const checker::Type *type) { - return VReg(usedRegs_--, type); + VReg vreg(usedRegs_--); + SetVRegType(vreg, type); + return vreg; } VReg NextReg() const @@ -191,6 +196,17 @@ public: throw Error(ErrorType::GENERIC, "", "Unimplemented code path"); } + void SetVRegType(VReg vreg, const checker::Type *type) + { + typeMap_.insert_or_assign(vreg.GetIndex(), type); + } + + const checker::Type *GetVRegType(VReg vreg) const + { + const auto it = typeMap_.find(vreg.GetIndex()); + return it != typeMap_.end() ? it->second : nullptr; + } + protected: SimpleAllocator &Sa() { @@ -232,6 +248,16 @@ protected: return programElement_; } + TypeMap &GetTypeMap() + { + return typeMap_; + } + + const TypeMap &GetTypeMap() const + { + return typeMap_; + } + private: ArenaAllocator *allocator_; CompilerContext *context_; @@ -239,8 +265,9 @@ private: binder::FunctionScope *topScope_; binder::Scope *scope_; const ir::AstNode *rootNode_; - ArenaList insns_; + ArenaVector insns_; ArenaVector catchList_; + TypeMap typeMap_; ProgramElement *programElement_; DynamicContext *dynamicContext_ {}; diff --git a/compiler/core/regAllocator.cpp b/compiler/core/regAllocator.cpp index e95c6c7d4..1e0beff71 100644 --- a/compiler/core/regAllocator.cpp +++ b/compiler/core/regAllocator.cpp @@ -40,30 +40,23 @@ Label *SimpleAllocator::AllocLabel(std::string &&id) return Alloc