diff --git a/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java b/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java index 66ea9cf29fb..f2c46e8ad30 100644 --- a/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java @@ -40342,6 +40342,46 @@ public final class DebugJsAstProtoBuf { */ org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.InlineModuleOrBuilder getInlineModuleOrBuilder( int index); + + /** + * optional string package_fqn = 10; + */ + boolean hasPackageFqn(); + /** + * optional string package_fqn = 10; + */ + java.lang.String getPackageFqn(); + /** + * optional string package_fqn = 10; + */ + org.jetbrains.kotlin.protobuf.ByteString + getPackageFqnBytes(); + + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + boolean hasTestsInvocation(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getTestsInvocation(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getTestsInvocationOrBuilder(); + + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + boolean hasMainInvocation(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getMainInvocation(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getMainInvocationOrBuilder(); } /** * Protobuf type {@code org.jetbrains.kotlin.serialization.js.ast.Fragment} @@ -40482,6 +40522,38 @@ public final class DebugJsAstProtoBuf { inlineModule_.add(input.readMessage(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.InlineModule.PARSER, extensionRegistry)); break; } + case 82: { + org.jetbrains.kotlin.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000008; + packageFqn_ = bs; + break; + } + case 90: { + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = testsInvocation_.toBuilder(); + } + testsInvocation_ = input.readMessage(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(testsInvocation_); + testsInvocation_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 98: { + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) == 0x00000020)) { + subBuilder = mainInvocation_.toBuilder(); + } + mainInvocation_ = input.readMessage(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(mainInvocation_); + mainInvocation_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } } } } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { @@ -40813,6 +40885,90 @@ public final class DebugJsAstProtoBuf { return inlineModule_.get(index); } + public static final int PACKAGE_FQN_FIELD_NUMBER = 10; + private java.lang.Object packageFqn_; + /** + * optional string package_fqn = 10; + */ + public boolean hasPackageFqn() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string package_fqn = 10; + */ + public java.lang.String getPackageFqn() { + java.lang.Object ref = packageFqn_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + org.jetbrains.kotlin.protobuf.ByteString bs = + (org.jetbrains.kotlin.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + packageFqn_ = s; + } + return s; + } + } + /** + * optional string package_fqn = 10; + */ + public org.jetbrains.kotlin.protobuf.ByteString + getPackageFqnBytes() { + java.lang.Object ref = packageFqn_; + if (ref instanceof java.lang.String) { + org.jetbrains.kotlin.protobuf.ByteString b = + org.jetbrains.kotlin.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + packageFqn_ = b; + return b; + } else { + return (org.jetbrains.kotlin.protobuf.ByteString) ref; + } + } + + public static final int TESTS_INVOCATION_FIELD_NUMBER = 11; + private org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement testsInvocation_; + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public boolean hasTestsInvocation() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getTestsInvocation() { + return testsInvocation_; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getTestsInvocationOrBuilder() { + return testsInvocation_; + } + + public static final int MAIN_INVOCATION_FIELD_NUMBER = 12; + private org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement mainInvocation_; + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public boolean hasMainInvocation() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getMainInvocation() { + return mainInvocation_; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getMainInvocationOrBuilder() { + return mainInvocation_; + } + private void initFields() { importedModule_ = java.util.Collections.emptyList(); importEntry_ = java.util.Collections.emptyList(); @@ -40823,6 +40979,9 @@ public final class DebugJsAstProtoBuf { classModel_ = java.util.Collections.emptyList(); moduleExpression_ = java.util.Collections.emptyList(); inlineModule_ = java.util.Collections.emptyList(); + packageFqn_ = ""; + testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); + mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -40884,6 +41043,18 @@ public final class DebugJsAstProtoBuf { return false; } } + if (hasTestsInvocation()) { + if (!getTestsInvocation().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasMainInvocation()) { + if (!getMainInvocation().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } memoizedIsInitialized = 1; return true; } @@ -40918,6 +41089,15 @@ public final class DebugJsAstProtoBuf { for (int i = 0; i < inlineModule_.size(); i++) { output.writeMessage(9, inlineModule_.get(i)); } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(10, getPackageFqnBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(11, testsInvocation_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeMessage(12, mainInvocation_); + } getUnknownFields().writeTo(output); } @@ -40963,6 +41143,18 @@ public final class DebugJsAstProtoBuf { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(9, inlineModule_.get(i)); } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeBytesSize(10, getPackageFqnBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeMessageSize(11, testsInvocation_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeMessageSize(12, mainInvocation_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -41081,6 +41273,8 @@ public final class DebugJsAstProtoBuf { getClassModelFieldBuilder(); getModuleExpressionFieldBuilder(); getInlineModuleFieldBuilder(); + getTestsInvocationFieldBuilder(); + getMainInvocationFieldBuilder(); } } private static Builder create() { @@ -41143,6 +41337,20 @@ public final class DebugJsAstProtoBuf { } else { inlineModuleBuilder_.clear(); } + packageFqn_ = ""; + bitField0_ = (bitField0_ & ~0x00000200); + if (testsInvocationBuilder_ == null) { + testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); + } else { + testsInvocationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000400); + if (mainInvocationBuilder_ == null) { + mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); + } else { + mainInvocationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000800); return this; } @@ -41249,6 +41457,26 @@ public final class DebugJsAstProtoBuf { } else { result.inlineModule_ = inlineModuleBuilder_.build(); } + if (((from_bitField0_ & 0x00000200) == 0x00000200)) { + to_bitField0_ |= 0x00000008; + } + result.packageFqn_ = packageFqn_; + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000010; + } + if (testsInvocationBuilder_ == null) { + result.testsInvocation_ = testsInvocation_; + } else { + result.testsInvocation_ = testsInvocationBuilder_.build(); + } + if (((from_bitField0_ & 0x00000800) == 0x00000800)) { + to_bitField0_ |= 0x00000020; + } + if (mainInvocationBuilder_ == null) { + result.mainInvocation_ = mainInvocation_; + } else { + result.mainInvocation_ = mainInvocationBuilder_.build(); + } result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -41430,6 +41658,17 @@ public final class DebugJsAstProtoBuf { } } } + if (other.hasPackageFqn()) { + bitField0_ |= 0x00000200; + packageFqn_ = other.packageFqn_; + onChanged(); + } + if (other.hasTestsInvocation()) { + mergeTestsInvocation(other.getTestsInvocation()); + } + if (other.hasMainInvocation()) { + mergeMainInvocation(other.getMainInvocation()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -41489,6 +41728,18 @@ public final class DebugJsAstProtoBuf { return false; } } + if (hasTestsInvocation()) { + if (!getTestsInvocation().isInitialized()) { + + return false; + } + } + if (hasMainInvocation()) { + if (!getMainInvocation().isInitialized()) { + + return false; + } + } return true; } @@ -43299,6 +43550,314 @@ public final class DebugJsAstProtoBuf { return inlineModuleBuilder_; } + private java.lang.Object packageFqn_ = ""; + /** + * optional string package_fqn = 10; + */ + public boolean hasPackageFqn() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional string package_fqn = 10; + */ + public java.lang.String getPackageFqn() { + java.lang.Object ref = packageFqn_; + if (!(ref instanceof java.lang.String)) { + org.jetbrains.kotlin.protobuf.ByteString bs = + (org.jetbrains.kotlin.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + packageFqn_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string package_fqn = 10; + */ + public org.jetbrains.kotlin.protobuf.ByteString + getPackageFqnBytes() { + java.lang.Object ref = packageFqn_; + if (ref instanceof String) { + org.jetbrains.kotlin.protobuf.ByteString b = + org.jetbrains.kotlin.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + packageFqn_ = b; + return b; + } else { + return (org.jetbrains.kotlin.protobuf.ByteString) ref; + } + } + /** + * optional string package_fqn = 10; + */ + public Builder setPackageFqn( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000200; + packageFqn_ = value; + onChanged(); + return this; + } + /** + * optional string package_fqn = 10; + */ + public Builder clearPackageFqn() { + bitField0_ = (bitField0_ & ~0x00000200); + packageFqn_ = getDefaultInstance().getPackageFqn(); + onChanged(); + return this; + } + /** + * optional string package_fqn = 10; + */ + public Builder setPackageFqnBytes( + org.jetbrains.kotlin.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000200; + packageFqn_ = value; + onChanged(); + return this; + } + + private org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); + private org.jetbrains.kotlin.protobuf.SingleFieldBuilder< + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder> testsInvocationBuilder_; + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public boolean hasTestsInvocation() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getTestsInvocation() { + if (testsInvocationBuilder_ == null) { + return testsInvocation_; + } else { + return testsInvocationBuilder_.getMessage(); + } + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder setTestsInvocation(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement value) { + if (testsInvocationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + testsInvocation_ = value; + onChanged(); + } else { + testsInvocationBuilder_.setMessage(value); + } + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder setTestsInvocation( + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder builderForValue) { + if (testsInvocationBuilder_ == null) { + testsInvocation_ = builderForValue.build(); + onChanged(); + } else { + testsInvocationBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder mergeTestsInvocation(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement value) { + if (testsInvocationBuilder_ == null) { + if (((bitField0_ & 0x00000400) == 0x00000400) && + testsInvocation_ != org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance()) { + testsInvocation_ = + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.newBuilder(testsInvocation_).mergeFrom(value).buildPartial(); + } else { + testsInvocation_ = value; + } + onChanged(); + } else { + testsInvocationBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder clearTestsInvocation() { + if (testsInvocationBuilder_ == null) { + testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); + onChanged(); + } else { + testsInvocationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000400); + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder getTestsInvocationBuilder() { + bitField0_ |= 0x00000400; + onChanged(); + return getTestsInvocationFieldBuilder().getBuilder(); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getTestsInvocationOrBuilder() { + if (testsInvocationBuilder_ != null) { + return testsInvocationBuilder_.getMessageOrBuilder(); + } else { + return testsInvocation_; + } + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + private org.jetbrains.kotlin.protobuf.SingleFieldBuilder< + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder> + getTestsInvocationFieldBuilder() { + if (testsInvocationBuilder_ == null) { + testsInvocationBuilder_ = new org.jetbrains.kotlin.protobuf.SingleFieldBuilder< + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder>( + getTestsInvocation(), + getParentForChildren(), + isClean()); + testsInvocation_ = null; + } + return testsInvocationBuilder_; + } + + private org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); + private org.jetbrains.kotlin.protobuf.SingleFieldBuilder< + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder> mainInvocationBuilder_; + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public boolean hasMainInvocation() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getMainInvocation() { + if (mainInvocationBuilder_ == null) { + return mainInvocation_; + } else { + return mainInvocationBuilder_.getMessage(); + } + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder setMainInvocation(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement value) { + if (mainInvocationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + mainInvocation_ = value; + onChanged(); + } else { + mainInvocationBuilder_.setMessage(value); + } + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder setMainInvocation( + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder builderForValue) { + if (mainInvocationBuilder_ == null) { + mainInvocation_ = builderForValue.build(); + onChanged(); + } else { + mainInvocationBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder mergeMainInvocation(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement value) { + if (mainInvocationBuilder_ == null) { + if (((bitField0_ & 0x00000800) == 0x00000800) && + mainInvocation_ != org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance()) { + mainInvocation_ = + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.newBuilder(mainInvocation_).mergeFrom(value).buildPartial(); + } else { + mainInvocation_ = value; + } + onChanged(); + } else { + mainInvocationBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder clearMainInvocation() { + if (mainInvocationBuilder_ == null) { + mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.getDefaultInstance(); + onChanged(); + } else { + mainInvocationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000800); + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder getMainInvocationBuilder() { + bitField0_ |= 0x00000800; + onChanged(); + return getMainInvocationFieldBuilder().getBuilder(); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getMainInvocationOrBuilder() { + if (mainInvocationBuilder_ != null) { + return mainInvocationBuilder_.getMessageOrBuilder(); + } else { + return mainInvocation_; + } + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + private org.jetbrains.kotlin.protobuf.SingleFieldBuilder< + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder> + getMainInvocationFieldBuilder() { + if (mainInvocationBuilder_ == null) { + mainInvocationBuilder_ = new org.jetbrains.kotlin.protobuf.SingleFieldBuilder< + org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder, org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder>( + getMainInvocation(), + getParentForChildren(), + isClean()); + mainInvocation_ = null; + } + return mainInvocationBuilder_; + } + // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.ast.Fragment) } @@ -49795,7 +50354,7 @@ public final class DebugJsAstProtoBuf { "4.org.jetbrains.kotlin.serialization.js." + "ast.Parameter\022B\n\004body\030\002 \002(\01324.org.jetbra" + "ins.kotlin.serialization.js.ast.Statemen" + - "t\"\007\n\005Empty\"\327\005\n\010Fragment\022R\n\017imported_modu", + "t\"\007\n\005Empty\"\213\007\n\010Fragment\022R\n\017imported_modu", "le\030\001 \003(\01329.org.jetbrains.kotlin.serializ" + "ation.js.ast.ImportedModule\022G\n\014import_en" + "try\030\002 \003(\01321.org.jetbrains.kotlin.seriali" + @@ -49813,43 +50372,47 @@ public final class DebugJsAstProtoBuf { "\010 \003(\01325.org.jetbrains.kotlin.serializati" + "on.js.ast.Expression\022N\n\rinline_module\030\t " + "\003(\01327.org.jetbrains.kotlin.serialization" + - ".js.ast.InlineModule\"\224\001\n\016ImportedModule\022" + - "\030\n\020external_name_id\030\001 \002(\005\022\030\n\020internal_na" + - "me_id\030\002 \002(\005\022N\n\017plain_reference\030\003 \001(\01325.o", - "rg.jetbrains.kotlin.serialization.js.ast" + - ".Expression\"i\n\006Import\022\024\n\014signature_id\030\001 " + - "\002(\005\022I\n\nexpression\030\002 \002(\01325.org.jetbrains." + - "kotlin.serialization.js.ast.Expression\"3" + - "\n\013NameBinding\022\024\n\014signature_id\030\001 \002(\005\022\016\n\006n" + - "ameId\030\002 \002(\005\"\247\001\n\nClassModel\022\017\n\007name_id\030\001 " + - "\002(\005\022\025\n\rsuper_name_id\030\002 \001(\005\022\031\n\021interface_" + - "name_id\030\004 \003(\005\022V\n\026post_declaration_block\030" + - "\003 \001(\01326.org.jetbrains.kotlin.serializati" + - "on.js.ast.GlobalBlock\";\n\014InlineModule\022\024\n", - "\014signature_id\030\001 \002(\005\022\025\n\rexpression_id\030\002 \002" + - "(\005\"\034\n\013StringTable\022\r\n\005entry\030\001 \003(\t\"K\n\tName" + - "Table\022>\n\005entry\030\001 \003(\0132/.org.jetbrains.kot" + - "lin.serialization.js.ast.Name\"\263\001\n\004Name\022\021" + - "\n\ttemporary\030\001 \002(\010\022\022\n\nidentifier\030\002 \001(\005\022\025\n" + - "\rlocal_name_id\030\003 \001(\005\022\027\n\010imported\030\004 \001(\010:\005" + - "false\022T\n\020special_function\030\005 \001(\0162:.org.je" + - "tbrains.kotlin.serialization.js.ast.Spec" + - "ialFunction\"\346\001\n\005Chunk\022L\n\014string_table\030\001 " + - "\002(\01326.org.jetbrains.kotlin.serialization", - ".js.ast.StringTable\022H\n\nname_table\030\002 \002(\0132" + - "4.org.jetbrains.kotlin.serialization.js." + - "ast.NameTable\022E\n\010fragment\030\003 \002(\01323.org.je" + - "tbrains.kotlin.serialization.js.ast.Frag" + - "ment*@\n\013SideEffects\022\021\n\rAFFECTS_STATE\020\001\022\024" + - "\n\020DEPENDS_ON_STATE\020\002\022\010\n\004PURE\020\003*?\n\016Inline" + - "Strategy\022\017\n\013AS_FUNCTION\020\000\022\014\n\010IN_PLACE\020\001\022" + - "\016\n\nNOT_INLINE\020\002*\327\001\n\017SpecialFunction\022\032\n\026D" + - "EFINE_INLINE_FUNCTION\020\001\022\021\n\rWRAP_FUNCTION" + - "\020\002\022\021\n\rTO_BOXED_CHAR\020\003\022\016\n\nUNBOX_CHAR\020\004\022\020\n", - "\014SUSPEND_CALL\020\005\022\024\n\020COROUTINE_RESULT\020\006\022\030\n" + - "\024COROUTINE_CONTROLLER\020\007\022\026\n\022COROUTINE_REC" + - "EIVER\020\010\022\030\n\024SET_COROUTINE_RESULT\020\tB\024B\022Deb" + - "ugJsAstProtoBuf" + ".js.ast.InlineModule\022\023\n\013package_fqn\030\n \001(" + + "\t\022N\n\020tests_invocation\030\013 \001(\01324.org.jetbra" + + "ins.kotlin.serialization.js.ast.Statemen", + "t\022M\n\017main_invocation\030\014 \001(\01324.org.jetbrai" + + "ns.kotlin.serialization.js.ast.Statement" + + "\"\224\001\n\016ImportedModule\022\030\n\020external_name_id\030" + + "\001 \002(\005\022\030\n\020internal_name_id\030\002 \002(\005\022N\n\017plain" + + "_reference\030\003 \001(\01325.org.jetbrains.kotlin." + + "serialization.js.ast.Expression\"i\n\006Impor" + + "t\022\024\n\014signature_id\030\001 \002(\005\022I\n\nexpression\030\002 " + + "\002(\01325.org.jetbrains.kotlin.serialization" + + ".js.ast.Expression\"3\n\013NameBinding\022\024\n\014sig" + + "nature_id\030\001 \002(\005\022\016\n\006nameId\030\002 \002(\005\"\247\001\n\nClas", + "sModel\022\017\n\007name_id\030\001 \002(\005\022\025\n\rsuper_name_id" + + "\030\002 \001(\005\022\031\n\021interface_name_id\030\004 \003(\005\022V\n\026pos" + + "t_declaration_block\030\003 \001(\01326.org.jetbrain" + + "s.kotlin.serialization.js.ast.GlobalBloc" + + "k\";\n\014InlineModule\022\024\n\014signature_id\030\001 \002(\005\022" + + "\025\n\rexpression_id\030\002 \002(\005\"\034\n\013StringTable\022\r\n" + + "\005entry\030\001 \003(\t\"K\n\tNameTable\022>\n\005entry\030\001 \003(\013" + + "2/.org.jetbrains.kotlin.serialization.js" + + ".ast.Name\"\263\001\n\004Name\022\021\n\ttemporary\030\001 \002(\010\022\022\n" + + "\nidentifier\030\002 \001(\005\022\025\n\rlocal_name_id\030\003 \001(\005", + "\022\027\n\010imported\030\004 \001(\010:\005false\022T\n\020special_fun" + + "ction\030\005 \001(\0162:.org.jetbrains.kotlin.seria" + + "lization.js.ast.SpecialFunction\"\346\001\n\005Chun" + + "k\022L\n\014string_table\030\001 \002(\01326.org.jetbrains." + + "kotlin.serialization.js.ast.StringTable\022" + + "H\n\nname_table\030\002 \002(\01324.org.jetbrains.kotl" + + "in.serialization.js.ast.NameTable\022E\n\010fra" + + "gment\030\003 \002(\01323.org.jetbrains.kotlin.seria" + + "lization.js.ast.Fragment*@\n\013SideEffects\022" + + "\021\n\rAFFECTS_STATE\020\001\022\024\n\020DEPENDS_ON_STATE\020\002", + "\022\010\n\004PURE\020\003*?\n\016InlineStrategy\022\017\n\013AS_FUNCT" + + "ION\020\000\022\014\n\010IN_PLACE\020\001\022\016\n\nNOT_INLINE\020\002*\327\001\n\017" + + "SpecialFunction\022\032\n\026DEFINE_INLINE_FUNCTIO" + + "N\020\001\022\021\n\rWRAP_FUNCTION\020\002\022\021\n\rTO_BOXED_CHAR\020" + + "\003\022\016\n\nUNBOX_CHAR\020\004\022\020\n\014SUSPEND_CALL\020\005\022\024\n\020C" + + "OROUTINE_RESULT\020\006\022\030\n\024COROUTINE_CONTROLLE" + + "R\020\007\022\026\n\022COROUTINE_RECEIVER\020\010\022\030\n\024SET_COROU" + + "TINE_RESULT\020\tB\024B\022DebugJsAstProtoBuf" }; org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -50138,7 +50701,7 @@ public final class DebugJsAstProtoBuf { internal_static_org_jetbrains_kotlin_serialization_js_ast_Fragment_fieldAccessorTable = new org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_org_jetbrains_kotlin_serialization_js_ast_Fragment_descriptor, - new java.lang.String[] { "ImportedModule", "ImportEntry", "DeclarationBlock", "ExportBlock", "InitializerBlock", "NameBinding", "ClassModel", "ModuleExpression", "InlineModule", }); + new java.lang.String[] { "ImportedModule", "ImportEntry", "DeclarationBlock", "ExportBlock", "InitializerBlock", "NameBinding", "ClassModel", "ModuleExpression", "InlineModule", "PackageFqn", "TestsInvocation", "MainInvocation", }); internal_static_org_jetbrains_kotlin_serialization_js_ast_ImportedModule_descriptor = getDescriptor().getMessageTypes().get(46); internal_static_org_jetbrains_kotlin_serialization_js_ast_ImportedModule_fieldAccessorTable = new diff --git a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt index 5793d9bb626..7916fc118a3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt @@ -88,6 +88,7 @@ class MainFunctionDetector { return isMain(functionDescriptor, checkJvmStaticAnnotation, allowParameterless = allowParameterless) } + @JvmOverloads fun isMain( descriptor: DeclarationDescriptor, checkJvmStaticAnnotation: Boolean = true, diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsProgramFragment.kt b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsProgramFragment.kt index 455c765ba0f..8e7ce23fd03 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsProgramFragment.kt +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsProgramFragment.kt @@ -6,13 +6,15 @@ package org.jetbrains.kotlin.js.backend.ast import java.util.* -class JsProgramFragment(val scope: JsScope) { - val importedModules: MutableList = ArrayList() +class JsProgramFragment(val scope: JsScope, val packageFqn: String) { + val importedModules = mutableListOf() val imports: MutableMap = LinkedHashMap() val declarationBlock = JsGlobalBlock() val exportBlock = JsGlobalBlock() val initializerBlock = JsGlobalBlock() - val nameBindings: MutableList = ArrayList() + val nameBindings = mutableListOf() val classes: MutableMap = LinkedHashMap() val inlineModuleMap: MutableMap = LinkedHashMap() + var tests: JsStatement? = null + var mainFunction: JsStatement? = null } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java index c98d12c2f5e..03d62b24053 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java @@ -106,6 +106,11 @@ public class JsInliner extends JsVisitorWithContextImpl { inliner.existingNameBindings = CollectUtilsKt.collectNameBindings(Collections.singletonList(fragment)); inliner.acceptStatement(fragment.getDeclarationBlock()); + // Mostly for the sake of post-processor + // TODO are inline function marked with @Test possible? + if (fragment.getTests() != null) { + inliner.acceptStatement(fragment.getTests()); + } // There can be inlined function in top-level initializers, we need to optimize them as well JsFunction fakeInitFunction = new JsFunction(JsDynamicScope.INSTANCE, fragment.getInitializerBlock(), ""); diff --git a/js/js.serializer/src/js-ast.proto b/js/js.serializer/src/js-ast.proto index e19b71f4cda..5b33dc968a0 100644 --- a/js/js.serializer/src/js-ast.proto +++ b/js/js.serializer/src/js-ast.proto @@ -385,6 +385,9 @@ message Fragment { repeated ClassModel class_model = 7; repeated Expression module_expression = 8; repeated InlineModule inline_module = 9; + optional string package_fqn = 10; + optional Statement tests_invocation = 11; + optional Statement main_invocation = 12; } message ImportedModule { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt index 83e31a74821..4e4c766aa22 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt @@ -56,7 +56,7 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable JsImportedModule( @@ -97,6 +97,14 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterablerepeated .org.jetbrains.kotlin.serialization.js.ast.InlineModule inline_module = 9; */ int getInlineModuleCount(); + + /** + * optional string package_fqn = 10; + */ + boolean hasPackageFqn(); + /** + * optional string package_fqn = 10; + */ + java.lang.String getPackageFqn(); + /** + * optional string package_fqn = 10; + */ + org.jetbrains.kotlin.protobuf.ByteString + getPackageFqnBytes(); + + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + boolean hasTestsInvocation(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getTestsInvocation(); + + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + boolean hasMainInvocation(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getMainInvocation(); } /** * Protobuf type {@code org.jetbrains.kotlin.serialization.js.ast.Fragment} @@ -29859,6 +29891,38 @@ public final class JsAstProtoBuf { inlineModule_.add(input.readMessage(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.InlineModule.PARSER, extensionRegistry)); break; } + case 82: { + org.jetbrains.kotlin.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000008; + packageFqn_ = bs; + break; + } + case 90: { + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = testsInvocation_.toBuilder(); + } + testsInvocation_ = input.readMessage(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(testsInvocation_); + testsInvocation_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 98: { + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) == 0x00000020)) { + subBuilder = mainInvocation_.toBuilder(); + } + mainInvocation_ = input.readMessage(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(mainInvocation_); + mainInvocation_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } } } } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { @@ -30166,6 +30230,78 @@ public final class JsAstProtoBuf { return inlineModule_.get(index); } + public static final int PACKAGE_FQN_FIELD_NUMBER = 10; + private java.lang.Object packageFqn_; + /** + * optional string package_fqn = 10; + */ + public boolean hasPackageFqn() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string package_fqn = 10; + */ + public java.lang.String getPackageFqn() { + java.lang.Object ref = packageFqn_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + org.jetbrains.kotlin.protobuf.ByteString bs = + (org.jetbrains.kotlin.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + packageFqn_ = s; + } + return s; + } + } + /** + * optional string package_fqn = 10; + */ + public org.jetbrains.kotlin.protobuf.ByteString + getPackageFqnBytes() { + java.lang.Object ref = packageFqn_; + if (ref instanceof java.lang.String) { + org.jetbrains.kotlin.protobuf.ByteString b = + org.jetbrains.kotlin.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + packageFqn_ = b; + return b; + } else { + return (org.jetbrains.kotlin.protobuf.ByteString) ref; + } + } + + public static final int TESTS_INVOCATION_FIELD_NUMBER = 11; + private org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement testsInvocation_; + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public boolean hasTestsInvocation() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getTestsInvocation() { + return testsInvocation_; + } + + public static final int MAIN_INVOCATION_FIELD_NUMBER = 12; + private org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement mainInvocation_; + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public boolean hasMainInvocation() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getMainInvocation() { + return mainInvocation_; + } + private void initFields() { importedModule_ = java.util.Collections.emptyList(); importEntry_ = java.util.Collections.emptyList(); @@ -30176,6 +30312,9 @@ public final class JsAstProtoBuf { classModel_ = java.util.Collections.emptyList(); moduleExpression_ = java.util.Collections.emptyList(); inlineModule_ = java.util.Collections.emptyList(); + packageFqn_ = ""; + testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); + mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -30237,6 +30376,18 @@ public final class JsAstProtoBuf { return false; } } + if (hasTestsInvocation()) { + if (!getTestsInvocation().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasMainInvocation()) { + if (!getMainInvocation().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } memoizedIsInitialized = 1; return true; } @@ -30271,6 +30422,15 @@ public final class JsAstProtoBuf { for (int i = 0; i < inlineModule_.size(); i++) { output.writeMessage(9, inlineModule_.get(i)); } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(10, getPackageFqnBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(11, testsInvocation_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeMessage(12, mainInvocation_); + } output.writeRawBytes(unknownFields); } @@ -30316,6 +30476,18 @@ public final class JsAstProtoBuf { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(9, inlineModule_.get(i)); } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeBytesSize(10, getPackageFqnBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeMessageSize(11, testsInvocation_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeMessageSize(12, mainInvocation_); + } size += unknownFields.size(); memoizedSerializedSize = size; return size; @@ -30428,6 +30600,12 @@ public final class JsAstProtoBuf { bitField0_ = (bitField0_ & ~0x00000080); inlineModule_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00000100); + packageFqn_ = ""; + bitField0_ = (bitField0_ & ~0x00000200); + testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); + bitField0_ = (bitField0_ & ~0x00000400); + mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); + bitField0_ = (bitField0_ & ~0x00000800); return this; } @@ -30493,6 +30671,18 @@ public final class JsAstProtoBuf { bitField0_ = (bitField0_ & ~0x00000100); } result.inlineModule_ = inlineModule_; + if (((from_bitField0_ & 0x00000200) == 0x00000200)) { + to_bitField0_ |= 0x00000008; + } + result.packageFqn_ = packageFqn_; + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000010; + } + result.testsInvocation_ = testsInvocation_; + if (((from_bitField0_ & 0x00000800) == 0x00000800)) { + to_bitField0_ |= 0x00000020; + } + result.mainInvocation_ = mainInvocation_; result.bitField0_ = to_bitField0_; return result; } @@ -30568,6 +30758,17 @@ public final class JsAstProtoBuf { } } + if (other.hasPackageFqn()) { + bitField0_ |= 0x00000200; + packageFqn_ = other.packageFqn_; + + } + if (other.hasTestsInvocation()) { + mergeTestsInvocation(other.getTestsInvocation()); + } + if (other.hasMainInvocation()) { + mergeMainInvocation(other.getMainInvocation()); + } setUnknownFields( getUnknownFields().concat(other.unknownFields)); return this; @@ -30628,6 +30829,18 @@ public final class JsAstProtoBuf { return false; } } + if (hasTestsInvocation()) { + if (!getTestsInvocation().isInitialized()) { + + return false; + } + } + if (hasMainInvocation()) { + if (!getMainInvocation().isInitialized()) { + + return false; + } + } return true; } @@ -31580,6 +31793,202 @@ public final class JsAstProtoBuf { return this; } + private java.lang.Object packageFqn_ = ""; + /** + * optional string package_fqn = 10; + */ + public boolean hasPackageFqn() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional string package_fqn = 10; + */ + public java.lang.String getPackageFqn() { + java.lang.Object ref = packageFqn_; + if (!(ref instanceof java.lang.String)) { + org.jetbrains.kotlin.protobuf.ByteString bs = + (org.jetbrains.kotlin.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + packageFqn_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string package_fqn = 10; + */ + public org.jetbrains.kotlin.protobuf.ByteString + getPackageFqnBytes() { + java.lang.Object ref = packageFqn_; + if (ref instanceof String) { + org.jetbrains.kotlin.protobuf.ByteString b = + org.jetbrains.kotlin.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + packageFqn_ = b; + return b; + } else { + return (org.jetbrains.kotlin.protobuf.ByteString) ref; + } + } + /** + * optional string package_fqn = 10; + */ + public Builder setPackageFqn( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000200; + packageFqn_ = value; + + return this; + } + /** + * optional string package_fqn = 10; + */ + public Builder clearPackageFqn() { + bitField0_ = (bitField0_ & ~0x00000200); + packageFqn_ = getDefaultInstance().getPackageFqn(); + + return this; + } + /** + * optional string package_fqn = 10; + */ + public Builder setPackageFqnBytes( + org.jetbrains.kotlin.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000200; + packageFqn_ = value; + + return this; + } + + private org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public boolean hasTestsInvocation() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getTestsInvocation() { + return testsInvocation_; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder setTestsInvocation(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement value) { + if (value == null) { + throw new NullPointerException(); + } + testsInvocation_ = value; + + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder setTestsInvocation( + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.Builder builderForValue) { + testsInvocation_ = builderForValue.build(); + + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder mergeTestsInvocation(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement value) { + if (((bitField0_ & 0x00000400) == 0x00000400) && + testsInvocation_ != org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance()) { + testsInvocation_ = + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.newBuilder(testsInvocation_).mergeFrom(value).buildPartial(); + } else { + testsInvocation_ = value; + } + + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11; + */ + public Builder clearTestsInvocation() { + testsInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); + + bitField0_ = (bitField0_ & ~0x00000400); + return this; + } + + private org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public boolean hasMainInvocation() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getMainInvocation() { + return mainInvocation_; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder setMainInvocation(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement value) { + if (value == null) { + throw new NullPointerException(); + } + mainInvocation_ = value; + + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder setMainInvocation( + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.Builder builderForValue) { + mainInvocation_ = builderForValue.build(); + + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder mergeMainInvocation(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement value) { + if (((bitField0_ & 0x00000800) == 0x00000800) && + mainInvocation_ != org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance()) { + mainInvocation_ = + org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.newBuilder(mainInvocation_).mergeFrom(value).buildPartial(); + } else { + mainInvocation_ = value; + } + + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12; + */ + public Builder clearMainInvocation() { + mainInvocation_ = org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.getDefaultInstance(); + + bitField0_ = (bitField0_ & ~0x00000800); + return this; + } + // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.ast.Fragment) } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt index e1fd907c0aa..a3b6a2b3a1e 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt @@ -62,6 +62,8 @@ class JsAstSerializer(private val pathResolver: (File) -> String) { private fun serializeFragment(fragment: JsProgramFragment): Fragment { val fragmentBuilder = Fragment.newBuilder() + fragmentBuilder.packageFqn = fragment.packageFqn + for (importedModule in fragment.importedModules) { val importedModuleBuilder = ImportedModule.newBuilder() importedModuleBuilder.externalNameId = serialize(importedModule.externalName) @@ -102,6 +104,14 @@ class JsAstSerializer(private val pathResolver: (File) -> String) { fragmentBuilder.addInlineModule(inlineModuleBuilder) } + fragment.tests?.let { + fragmentBuilder.setTestsInvocation(serialize(it)) + } + + fragment.mainFunction?.let { + fragmentBuilder.setMainInvocation(serialize(it)) + } + return fragmentBuilder.build() } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index 82f5f12207b..c3b154a85d7 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -158,11 +158,12 @@ public final class StaticContext { @NotNull BindingTrace bindingTrace, @NotNull JsConfig config, @NotNull ModuleDescriptor moduleDescriptor, - @NotNull SourceFilePathResolver sourceFilePathResolver + @NotNull SourceFilePathResolver sourceFilePathResolver, + @NotNull String packageFqn ) { program = new JsProgram(); JsFunction rootFunction = JsAstUtils.createFunctionWithEmptyBody(program.getScope()); - fragment = new JsProgramFragment(rootFunction.getScope()); + fragment = new JsProgramFragment(rootFunction.getScope(), packageFqn); this.bindingTrace = bindingTrace; this.namer = Namer.newInstance(program.getRootScope()); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt index db666647346..c08450df7c8 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt @@ -34,6 +34,8 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam val importBlock = JsGlobalBlock() private val declarationBlock = JsGlobalBlock() private val initializerBlock = JsGlobalBlock() + private val testsMap = mutableMapOf() + private var mainFn: Pair? = null private val exportBlock = JsGlobalBlock() private val declaredImports = mutableSetOf() private val classes = mutableMapOf() @@ -55,11 +57,42 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam declarationBlock.statements += fragment.declarationBlock initializerBlock.statements += fragment.initializerBlock + fragment.tryUpdateTests() + fragment.tryUpdateMain() addExportStatements(fragment) classes += fragment.classes } + private fun JsProgramFragment.tryUpdateTests() { + tests?.let { newTests -> + testsMap.putIfAbsent(packageFqn, newTests)?.let { oldTests -> + oldTests.decomposeTestInvocation()?.let {oldTestBody -> + newTests.decomposeTestInvocation()?.let { newTestBody -> + oldTestBody.statements += newTestBody.statements + } + } + } + } + } + + private fun JsStatement.decomposeTestInvocation(): JsBlock? { + return (this as? JsExpressionStatement)?.let { + (it.expression as? JsInvocation)?.let { + (it.arguments[2] as? JsFunction)?.body + } + } + } + + private fun JsProgramFragment.tryUpdateMain() { + mainFunction?.let { m -> + val currentMainFqn = mainFn?.first + if (currentMainFqn == null || currentMainFqn > packageFqn) { + mainFn = packageFqn to m + } + } + } + val importedModules: List get() = importedModulesImpl @@ -136,6 +169,9 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam fragment.classes += classes.map { it.name to it } fragment.inlineModuleMap.forEach { (_, value) -> rename(value) } + + fragment.tests?.let { rename(it) } + fragment.mainFunction?.let { rename(it) } } private fun Map.rename(rootNode: T): T { @@ -174,6 +210,8 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam this += exportBlock.statements addClassPostDeclarations(this) this += initializerBlock.statements + this += testsMap.values + mainFn?.second?.let { this += it } } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java index cd074466910..949d0d2d69e 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java @@ -340,15 +340,21 @@ public final class Translation { for (TranslationUnit unit : units) { if (unit instanceof TranslationUnit.SourceFile) { KtFile file = ((TranslationUnit.SourceFile) unit).getFile(); - StaticContext staticContext = new StaticContext(bindingTrace, config, moduleDescriptor, sourceFilePathResolver); + StaticContext staticContext = new StaticContext(bindingTrace, config, moduleDescriptor, sourceFilePathResolver, file.getPackageFqName().asString()); TranslationContext context = TranslationContext.rootContext(staticContext); List fileMemberScope = new ArrayList<>(); translateFile(context, file, fileMemberScope); - fragments.add(staticContext.getFragment()); - newFragments.add(staticContext.getFragment()); - fragmentMap.put(file, staticContext.getFragment()); + + JsProgramFragment fragment = staticContext.getFragment(); + + fragment.setTests(mayBeGenerateTests(context, file, fileMemberScope)); + fragment.setMainFunction(maybeGenerateCallToMain(context, config, moduleDescriptor, fileMemberScope, mainCallParameters)); + + fragments.add(fragment); + newFragments.add(fragment); + fragmentMap.put(file, fragment); fileMemberScopes.put(file, fileMemberScope); - merger.addFragment(staticContext.getFragment()); + merger.addFragment(fragment); } else if (unit instanceof TranslationUnit.BinaryAst) { byte[] astData = ((TranslationUnit.BinaryAst) unit).getData(); @@ -358,22 +364,8 @@ public final class Translation { } } - JsProgramFragment testFragment = mayBeGenerateTests(config, bindingTrace, moduleDescriptor, sourceFilePathResolver); - fragments.add(testFragment); - newFragments.add(testFragment); - merger.addFragment(testFragment); rootFunction.getParameters().add(new JsParameter(internalModuleName)); - if (mainCallParameters.shouldBeGenerated()) { - JsProgramFragment mainCallFragment = generateCallToMain( - bindingTrace, config, moduleDescriptor, sourceFilePathResolver, mainCallParameters.arguments()); - if (mainCallFragment != null) { - fragments.add(mainCallFragment); - newFragments.add(mainCallFragment); - merger.addFragment(mainCallFragment); - } - } - merger.merge(); JsBlock rootBlock = rootFunction.getBody(); @@ -447,30 +439,36 @@ public final class Translation { } } - @NotNull - private static JsProgramFragment mayBeGenerateTests( - @NotNull JsConfig config, @NotNull BindingTrace trace, - @NotNull ModuleDescriptor moduleDescriptor, @NotNull SourceFilePathResolver sourceFilePathResolver + @Nullable + private static JsStatement mayBeGenerateTests( + @NotNull TranslationContext context, + @NotNull KtFile file, + @NotNull List fileMemberScope ) { - StaticContext staticContext = new StaticContext(trace, config, moduleDescriptor, sourceFilePathResolver); - TranslationContext context = TranslationContext.rootContext(staticContext); - - new JSTestGenerator(context).generateTestCalls(moduleDescriptor); - - return staticContext.getFragment(); + return new JSTestGenerator(context).generateTestCalls(file, fileMemberScope); } //TODO: determine whether should throw exception @Nullable - private static JsProgramFragment generateCallToMain( - @NotNull BindingTrace trace, @NotNull JsConfig config, @NotNull ModuleDescriptor moduleDescriptor, - @NotNull SourceFilePathResolver sourceFilePathResolver, - @NotNull List arguments + private static JsStatement maybeGenerateCallToMain( + @NotNull TranslationContext context, + @NotNull JsConfig config, + @NotNull ModuleDescriptor moduleDescriptor, + @NotNull List fileMemberScope, + @NotNull MainCallParameters mainCallParameters ) { - StaticContext staticContext = new StaticContext(trace, config, moduleDescriptor, sourceFilePathResolver); - TranslationContext context = TranslationContext.rootContext(staticContext); + if (!mainCallParameters.shouldBeGenerated()) return null; + MainFunctionDetector mainFunctionDetector = new MainFunctionDetector(context.bindingContext(), config.getLanguageVersionSettings()); - FunctionDescriptor functionDescriptor = mainFunctionDetector.getMainFunction(moduleDescriptor); + + FunctionDescriptor functionDescriptor = null; + + for (DeclarationDescriptor d : fileMemberScope) { + if (mainFunctionDetector.isMain(d)) { + functionDescriptor = (FunctionDescriptor)d; + } + } + if (functionDescriptor == null) { return null; } @@ -480,7 +478,7 @@ public final class Translation { List args = new ArrayList<>(); if (parameterCount != 0) { - args.add(new JsArrayLiteral(toStringLiteralList(arguments))); + args.add(new JsArrayLiteral(toStringLiteralList(mainCallParameters.arguments()))); } if (functionDescriptor.isSuspend()) { @@ -492,7 +490,6 @@ public final class Translation { } JsExpression call = CallTranslator.INSTANCE.buildCall(context, functionDescriptor, args, null); - context.addTopLevelStatement(call.makeStmt()); - return staticContext.getFragment(); + return call.makeStmt(); } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/test/JSTestGenerator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/test/JSTestGenerator.kt index ea6b6046e2d..0494aeb0f7c 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/test/JSTestGenerator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/test/JSTestGenerator.kt @@ -24,14 +24,25 @@ import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope class JSTestGenerator(val context: TranslationContext) { - fun generateTestCalls(moduleDescriptor: ModuleDescriptor) { - generateTestCalls(moduleDescriptor, FqName.ROOT) + fun generateTestCalls(file: KtFile, fileMemberScope: List): JsStatement? { + val testsFunction = JsFunction(context.scope(), JsBlock(), "${file.virtualFilePath} file suite function") + fileMemberScope.forEach { + if (it is ClassDescriptor) { + generateTestFunctions(it, testsFunction) + } + } + if (!testsFunction.body.isEmpty) { + val suiteName = JsStringLiteral(file.packageFqName.asString()) + return JsInvocation(suiteRef, suiteName, JsBooleanLiteral(false), testsFunction).makeStmt() + } + return null } private fun generateTestCalls(moduleDescriptor: ModuleDescriptor, packageName: FqName) {