JS: incremental translation of tests and main fun invocation

This commit is contained in:
Anton Bannykh
2018-11-13 21:07:38 +03:00
parent 0397af79b4
commit 3529114913
12 changed files with 1134 additions and 86 deletions
@@ -40342,6 +40342,46 @@ public final class DebugJsAstProtoBuf {
*/ */
org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.InlineModuleOrBuilder getInlineModuleOrBuilder( org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.InlineModuleOrBuilder getInlineModuleOrBuilder(
int index); int index);
/**
* <code>optional string package_fqn = 10;</code>
*/
boolean hasPackageFqn();
/**
* <code>optional string package_fqn = 10;</code>
*/
java.lang.String getPackageFqn();
/**
* <code>optional string package_fqn = 10;</code>
*/
org.jetbrains.kotlin.protobuf.ByteString
getPackageFqnBytes();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
boolean hasTestsInvocation();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getTestsInvocation();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getTestsInvocationOrBuilder();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
boolean hasMainInvocation();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getMainInvocation();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getMainInvocationOrBuilder();
} }
/** /**
* Protobuf type {@code org.jetbrains.kotlin.serialization.js.ast.Fragment} * 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)); inlineModule_.add(input.readMessage(org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.InlineModule.PARSER, extensionRegistry));
break; 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) { } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
@@ -40813,6 +40885,90 @@ public final class DebugJsAstProtoBuf {
return inlineModule_.get(index); return inlineModule_.get(index);
} }
public static final int PACKAGE_FQN_FIELD_NUMBER = 10;
private java.lang.Object packageFqn_;
/**
* <code>optional string package_fqn = 10;</code>
*/
public boolean hasPackageFqn() {
return ((bitField0_ & 0x00000008) == 0x00000008);
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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;
}
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public boolean hasTestsInvocation() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getTestsInvocation() {
return testsInvocation_;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public boolean hasMainInvocation() {
return ((bitField0_ & 0x00000020) == 0x00000020);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getMainInvocation() {
return mainInvocation_;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getMainInvocationOrBuilder() {
return mainInvocation_;
}
private void initFields() { private void initFields() {
importedModule_ = java.util.Collections.emptyList(); importedModule_ = java.util.Collections.emptyList();
importEntry_ = java.util.Collections.emptyList(); importEntry_ = java.util.Collections.emptyList();
@@ -40823,6 +40979,9 @@ public final class DebugJsAstProtoBuf {
classModel_ = java.util.Collections.emptyList(); classModel_ = java.util.Collections.emptyList();
moduleExpression_ = java.util.Collections.emptyList(); moduleExpression_ = java.util.Collections.emptyList();
inlineModule_ = 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; private byte memoizedIsInitialized = -1;
public final boolean isInitialized() { public final boolean isInitialized() {
@@ -40884,6 +41043,18 @@ public final class DebugJsAstProtoBuf {
return false; return false;
} }
} }
if (hasTestsInvocation()) {
if (!getTestsInvocation().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
if (hasMainInvocation()) {
if (!getMainInvocation().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
memoizedIsInitialized = 1; memoizedIsInitialized = 1;
return true; return true;
} }
@@ -40918,6 +41089,15 @@ public final class DebugJsAstProtoBuf {
for (int i = 0; i < inlineModule_.size(); i++) { for (int i = 0; i < inlineModule_.size(); i++) {
output.writeMessage(9, inlineModule_.get(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); getUnknownFields().writeTo(output);
} }
@@ -40963,6 +41143,18 @@ public final class DebugJsAstProtoBuf {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(9, inlineModule_.get(i)); .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(); size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size; memoizedSerializedSize = size;
return size; return size;
@@ -41081,6 +41273,8 @@ public final class DebugJsAstProtoBuf {
getClassModelFieldBuilder(); getClassModelFieldBuilder();
getModuleExpressionFieldBuilder(); getModuleExpressionFieldBuilder();
getInlineModuleFieldBuilder(); getInlineModuleFieldBuilder();
getTestsInvocationFieldBuilder();
getMainInvocationFieldBuilder();
} }
} }
private static Builder create() { private static Builder create() {
@@ -41143,6 +41337,20 @@ public final class DebugJsAstProtoBuf {
} else { } else {
inlineModuleBuilder_.clear(); 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; return this;
} }
@@ -41249,6 +41457,26 @@ public final class DebugJsAstProtoBuf {
} else { } else {
result.inlineModule_ = inlineModuleBuilder_.build(); 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_; result.bitField0_ = to_bitField0_;
onBuilt(); onBuilt();
return result; 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()); this.mergeUnknownFields(other.getUnknownFields());
return this; return this;
} }
@@ -41489,6 +41728,18 @@ public final class DebugJsAstProtoBuf {
return false; return false;
} }
} }
if (hasTestsInvocation()) {
if (!getTestsInvocation().isInitialized()) {
return false;
}
}
if (hasMainInvocation()) {
if (!getMainInvocation().isInitialized()) {
return false;
}
}
return true; return true;
} }
@@ -43299,6 +43550,314 @@ public final class DebugJsAstProtoBuf {
return inlineModuleBuilder_; return inlineModuleBuilder_;
} }
private java.lang.Object packageFqn_ = "";
/**
* <code>optional string package_fqn = 10;</code>
*/
public boolean hasPackageFqn() {
return ((bitField0_ & 0x00000200) == 0x00000200);
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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;
}
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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;
}
}
/**
* <code>optional string package_fqn = 10;</code>
*/
public Builder setPackageFqn(
java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000200;
packageFqn_ = value;
onChanged();
return this;
}
/**
* <code>optional string package_fqn = 10;</code>
*/
public Builder clearPackageFqn() {
bitField0_ = (bitField0_ & ~0x00000200);
packageFqn_ = getDefaultInstance().getPackageFqn();
onChanged();
return this;
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public boolean hasTestsInvocation() {
return ((bitField0_ & 0x00000400) == 0x00000400);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getTestsInvocation() {
if (testsInvocationBuilder_ == null) {
return testsInvocation_;
} else {
return testsInvocationBuilder_.getMessage();
}
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder getTestsInvocationBuilder() {
bitField0_ |= 0x00000400;
onChanged();
return getTestsInvocationFieldBuilder().getBuilder();
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getTestsInvocationOrBuilder() {
if (testsInvocationBuilder_ != null) {
return testsInvocationBuilder_.getMessageOrBuilder();
} else {
return testsInvocation_;
}
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public boolean hasMainInvocation() {
return ((bitField0_ & 0x00000800) == 0x00000800);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement getMainInvocation() {
if (mainInvocationBuilder_ == null) {
return mainInvocation_;
} else {
return mainInvocationBuilder_.getMessage();
}
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.Statement.Builder getMainInvocationBuilder() {
bitField0_ |= 0x00000800;
onChanged();
return getMainInvocationFieldBuilder().getBuilder();
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.DebugJsAstProtoBuf.StatementOrBuilder getMainInvocationOrBuilder() {
if (mainInvocationBuilder_ != null) {
return mainInvocationBuilder_.getMessageOrBuilder();
} else {
return mainInvocation_;
}
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
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) // @@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." + "4.org.jetbrains.kotlin.serialization.js." +
"ast.Parameter\022B\n\004body\030\002 \002(\01324.org.jetbra" + "ast.Parameter\022B\n\004body\030\002 \002(\01324.org.jetbra" +
"ins.kotlin.serialization.js.ast.Statemen" + "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" + "le\030\001 \003(\01329.org.jetbrains.kotlin.serializ" +
"ation.js.ast.ImportedModule\022G\n\014import_en" + "ation.js.ast.ImportedModule\022G\n\014import_en" +
"try\030\002 \003(\01321.org.jetbrains.kotlin.seriali" + "try\030\002 \003(\01321.org.jetbrains.kotlin.seriali" +
@@ -49813,43 +50372,47 @@ public final class DebugJsAstProtoBuf {
"\010 \003(\01325.org.jetbrains.kotlin.serializati" + "\010 \003(\01325.org.jetbrains.kotlin.serializati" +
"on.js.ast.Expression\022N\n\rinline_module\030\t " + "on.js.ast.Expression\022N\n\rinline_module\030\t " +
"\003(\01327.org.jetbrains.kotlin.serialization" + "\003(\01327.org.jetbrains.kotlin.serialization" +
".js.ast.InlineModule\"\224\001\n\016ImportedModule\022" + ".js.ast.InlineModule\022\023\n\013package_fqn\030\n \001(" +
"\030\n\020external_name_id\030\001 \002(\005\022\030\n\020internal_na" + "\t\022N\n\020tests_invocation\030\013 \001(\01324.org.jetbra" +
"me_id\030\002 \002(\005\022N\n\017plain_reference\030\003 \001(\01325.o", "ins.kotlin.serialization.js.ast.Statemen",
"rg.jetbrains.kotlin.serialization.js.ast" + "t\022M\n\017main_invocation\030\014 \001(\01324.org.jetbrai" +
".Expression\"i\n\006Import\022\024\n\014signature_id\030\001 " + "ns.kotlin.serialization.js.ast.Statement" +
"\002(\005\022I\n\nexpression\030\002 \002(\01325.org.jetbrains." + "\"\224\001\n\016ImportedModule\022\030\n\020external_name_id\030" +
"kotlin.serialization.js.ast.Expression\"3" + "\001 \002(\005\022\030\n\020internal_name_id\030\002 \002(\005\022N\n\017plain" +
"\n\013NameBinding\022\024\n\014signature_id\030\001 \002(\005\022\016\n\006n" + "_reference\030\003 \001(\01325.org.jetbrains.kotlin." +
"ameId\030\002 \002(\005\"\247\001\n\nClassModel\022\017\n\007name_id\030\001 " + "serialization.js.ast.Expression\"i\n\006Impor" +
"\002(\005\022\025\n\rsuper_name_id\030\002 \001(\005\022\031\n\021interface_" + "t\022\024\n\014signature_id\030\001 \002(\005\022I\n\nexpression\030\002 " +
"name_id\030\004 \003(\005\022V\n\026post_declaration_block\030" + "\002(\01325.org.jetbrains.kotlin.serialization" +
"\003 \001(\01326.org.jetbrains.kotlin.serializati" + ".js.ast.Expression\"3\n\013NameBinding\022\024\n\014sig" +
"on.js.ast.GlobalBlock\";\n\014InlineModule\022\024\n", "nature_id\030\001 \002(\005\022\016\n\006nameId\030\002 \002(\005\"\247\001\n\nClas",
"\014signature_id\030\001 \002(\005\022\025\n\rexpression_id\030\002 \002" + "sModel\022\017\n\007name_id\030\001 \002(\005\022\025\n\rsuper_name_id" +
"(\005\"\034\n\013StringTable\022\r\n\005entry\030\001 \003(\t\"K\n\tName" + "\030\002 \001(\005\022\031\n\021interface_name_id\030\004 \003(\005\022V\n\026pos" +
"Table\022>\n\005entry\030\001 \003(\0132/.org.jetbrains.kot" + "t_declaration_block\030\003 \001(\01326.org.jetbrain" +
"lin.serialization.js.ast.Name\"\263\001\n\004Name\022\021" + "s.kotlin.serialization.js.ast.GlobalBloc" +
"\n\ttemporary\030\001 \002(\010\022\022\n\nidentifier\030\002 \001(\005\022\025\n" + "k\";\n\014InlineModule\022\024\n\014signature_id\030\001 \002(\005\022" +
"\rlocal_name_id\030\003 \001(\005\022\027\n\010imported\030\004 \001(\010:\005" + "\025\n\rexpression_id\030\002 \002(\005\"\034\n\013StringTable\022\r\n" +
"false\022T\n\020special_function\030\005 \001(\0162:.org.je" + "\005entry\030\001 \003(\t\"K\n\tNameTable\022>\n\005entry\030\001 \003(\013" +
"tbrains.kotlin.serialization.js.ast.Spec" + "2/.org.jetbrains.kotlin.serialization.js" +
"ialFunction\"\346\001\n\005Chunk\022L\n\014string_table\030\001 " + ".ast.Name\"\263\001\n\004Name\022\021\n\ttemporary\030\001 \002(\010\022\022\n" +
"\002(\01326.org.jetbrains.kotlin.serialization", "\nidentifier\030\002 \001(\005\022\025\n\rlocal_name_id\030\003 \001(\005",
".js.ast.StringTable\022H\n\nname_table\030\002 \002(\0132" + "\022\027\n\010imported\030\004 \001(\010:\005false\022T\n\020special_fun" +
"4.org.jetbrains.kotlin.serialization.js." + "ction\030\005 \001(\0162:.org.jetbrains.kotlin.seria" +
"ast.NameTable\022E\n\010fragment\030\003 \002(\01323.org.je" + "lization.js.ast.SpecialFunction\"\346\001\n\005Chun" +
"tbrains.kotlin.serialization.js.ast.Frag" + "k\022L\n\014string_table\030\001 \002(\01326.org.jetbrains." +
"ment*@\n\013SideEffects\022\021\n\rAFFECTS_STATE\020\001\022\024" + "kotlin.serialization.js.ast.StringTable\022" +
"\n\020DEPENDS_ON_STATE\020\002\022\010\n\004PURE\020\003*?\n\016Inline" + "H\n\nname_table\030\002 \002(\01324.org.jetbrains.kotl" +
"Strategy\022\017\n\013AS_FUNCTION\020\000\022\014\n\010IN_PLACE\020\001\022" + "in.serialization.js.ast.NameTable\022E\n\010fra" +
"\016\n\nNOT_INLINE\020\002*\327\001\n\017SpecialFunction\022\032\n\026D" + "gment\030\003 \002(\01323.org.jetbrains.kotlin.seria" +
"EFINE_INLINE_FUNCTION\020\001\022\021\n\rWRAP_FUNCTION" + "lization.js.ast.Fragment*@\n\013SideEffects\022" +
"\020\002\022\021\n\rTO_BOXED_CHAR\020\003\022\016\n\nUNBOX_CHAR\020\004\022\020\n", "\021\n\rAFFECTS_STATE\020\001\022\024\n\020DEPENDS_ON_STATE\020\002",
"\014SUSPEND_CALL\020\005\022\024\n\020COROUTINE_RESULT\020\006\022\030\n" + "\022\010\n\004PURE\020\003*?\n\016InlineStrategy\022\017\n\013AS_FUNCT" +
"\024COROUTINE_CONTROLLER\020\007\022\026\n\022COROUTINE_REC" + "ION\020\000\022\014\n\010IN_PLACE\020\001\022\016\n\nNOT_INLINE\020\002*\327\001\n\017" +
"EIVER\020\010\022\030\n\024SET_COROUTINE_RESULT\020\tB\024B\022Deb" + "SpecialFunction\022\032\n\026DEFINE_INLINE_FUNCTIO" +
"ugJsAstProtoBuf" "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 = org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { 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 internal_static_org_jetbrains_kotlin_serialization_js_ast_Fragment_fieldAccessorTable = new
org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_org_jetbrains_kotlin_serialization_js_ast_Fragment_descriptor, 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 = internal_static_org_jetbrains_kotlin_serialization_js_ast_ImportedModule_descriptor =
getDescriptor().getMessageTypes().get(46); getDescriptor().getMessageTypes().get(46);
internal_static_org_jetbrains_kotlin_serialization_js_ast_ImportedModule_fieldAccessorTable = new internal_static_org_jetbrains_kotlin_serialization_js_ast_ImportedModule_fieldAccessorTable = new
@@ -88,6 +88,7 @@ class MainFunctionDetector {
return isMain(functionDescriptor, checkJvmStaticAnnotation, allowParameterless = allowParameterless) return isMain(functionDescriptor, checkJvmStaticAnnotation, allowParameterless = allowParameterless)
} }
@JvmOverloads
fun isMain( fun isMain(
descriptor: DeclarationDescriptor, descriptor: DeclarationDescriptor,
checkJvmStaticAnnotation: Boolean = true, checkJvmStaticAnnotation: Boolean = true,
@@ -6,13 +6,15 @@ package org.jetbrains.kotlin.js.backend.ast
import java.util.* import java.util.*
class JsProgramFragment(val scope: JsScope) { class JsProgramFragment(val scope: JsScope, val packageFqn: String) {
val importedModules: MutableList<JsImportedModule> = ArrayList() val importedModules = mutableListOf<JsImportedModule>()
val imports: MutableMap<String, JsExpression> = LinkedHashMap() val imports: MutableMap<String, JsExpression> = LinkedHashMap()
val declarationBlock = JsGlobalBlock() val declarationBlock = JsGlobalBlock()
val exportBlock = JsGlobalBlock() val exportBlock = JsGlobalBlock()
val initializerBlock = JsGlobalBlock() val initializerBlock = JsGlobalBlock()
val nameBindings: MutableList<JsNameBinding> = ArrayList() val nameBindings = mutableListOf<JsNameBinding>()
val classes: MutableMap<JsName, JsClassModel> = LinkedHashMap() val classes: MutableMap<JsName, JsClassModel> = LinkedHashMap()
val inlineModuleMap: MutableMap<String, JsExpression> = LinkedHashMap() val inlineModuleMap: MutableMap<String, JsExpression> = LinkedHashMap()
var tests: JsStatement? = null
var mainFunction: JsStatement? = null
} }
@@ -106,6 +106,11 @@ public class JsInliner extends JsVisitorWithContextImpl {
inliner.existingNameBindings = CollectUtilsKt.collectNameBindings(Collections.singletonList(fragment)); inliner.existingNameBindings = CollectUtilsKt.collectNameBindings(Collections.singletonList(fragment));
inliner.acceptStatement(fragment.getDeclarationBlock()); 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 // There can be inlined function in top-level initializers, we need to optimize them as well
JsFunction fakeInitFunction = new JsFunction(JsDynamicScope.INSTANCE, fragment.getInitializerBlock(), ""); JsFunction fakeInitFunction = new JsFunction(JsDynamicScope.INSTANCE, fragment.getInitializerBlock(), "");
+3
View File
@@ -385,6 +385,9 @@ message Fragment {
repeated ClassModel class_model = 7; repeated ClassModel class_model = 7;
repeated Expression module_expression = 8; repeated Expression module_expression = 8;
repeated InlineModule inline_module = 9; repeated InlineModule inline_module = 9;
optional string package_fqn = 10;
optional Statement tests_invocation = 11;
optional Statement main_invocation = 12;
} }
message ImportedModule { message ImportedModule {
@@ -56,7 +56,7 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<Fi
} }
private fun deserialize(proto: Fragment): JsProgramFragment { private fun deserialize(proto: Fragment): JsProgramFragment {
val fragment = JsProgramFragment(scope) val fragment = JsProgramFragment(scope, proto.packageFqn)
fragment.importedModules += proto.importedModuleList.map { importedModuleProto -> fragment.importedModules += proto.importedModuleList.map { importedModuleProto ->
JsImportedModule( JsImportedModule(
@@ -97,6 +97,14 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<Fi
} }
} }
if (proto.hasTestsInvocation()) {
fragment.tests = deserialize(proto.testsInvocation)
}
if (proto.hasMainInvocation()) {
fragment.mainFunction = deserialize(proto.mainInvocation)
}
return fragment return fragment
} }
@@ -29721,6 +29721,38 @@ public final class JsAstProtoBuf {
* <code>repeated .org.jetbrains.kotlin.serialization.js.ast.InlineModule inline_module = 9;</code> * <code>repeated .org.jetbrains.kotlin.serialization.js.ast.InlineModule inline_module = 9;</code>
*/ */
int getInlineModuleCount(); int getInlineModuleCount();
/**
* <code>optional string package_fqn = 10;</code>
*/
boolean hasPackageFqn();
/**
* <code>optional string package_fqn = 10;</code>
*/
java.lang.String getPackageFqn();
/**
* <code>optional string package_fqn = 10;</code>
*/
org.jetbrains.kotlin.protobuf.ByteString
getPackageFqnBytes();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
boolean hasTestsInvocation();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getTestsInvocation();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
boolean hasMainInvocation();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getMainInvocation();
} }
/** /**
* Protobuf type {@code org.jetbrains.kotlin.serialization.js.ast.Fragment} * 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)); inlineModule_.add(input.readMessage(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.InlineModule.PARSER, extensionRegistry));
break; 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) { } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
@@ -30166,6 +30230,78 @@ public final class JsAstProtoBuf {
return inlineModule_.get(index); return inlineModule_.get(index);
} }
public static final int PACKAGE_FQN_FIELD_NUMBER = 10;
private java.lang.Object packageFqn_;
/**
* <code>optional string package_fqn = 10;</code>
*/
public boolean hasPackageFqn() {
return ((bitField0_ & 0x00000008) == 0x00000008);
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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;
}
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public boolean hasTestsInvocation() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public boolean hasMainInvocation() {
return ((bitField0_ & 0x00000020) == 0x00000020);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getMainInvocation() {
return mainInvocation_;
}
private void initFields() { private void initFields() {
importedModule_ = java.util.Collections.emptyList(); importedModule_ = java.util.Collections.emptyList();
importEntry_ = java.util.Collections.emptyList(); importEntry_ = java.util.Collections.emptyList();
@@ -30176,6 +30312,9 @@ public final class JsAstProtoBuf {
classModel_ = java.util.Collections.emptyList(); classModel_ = java.util.Collections.emptyList();
moduleExpression_ = java.util.Collections.emptyList(); moduleExpression_ = java.util.Collections.emptyList();
inlineModule_ = 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; private byte memoizedIsInitialized = -1;
public final boolean isInitialized() { public final boolean isInitialized() {
@@ -30237,6 +30376,18 @@ public final class JsAstProtoBuf {
return false; return false;
} }
} }
if (hasTestsInvocation()) {
if (!getTestsInvocation().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
if (hasMainInvocation()) {
if (!getMainInvocation().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
memoizedIsInitialized = 1; memoizedIsInitialized = 1;
return true; return true;
} }
@@ -30271,6 +30422,15 @@ public final class JsAstProtoBuf {
for (int i = 0; i < inlineModule_.size(); i++) { for (int i = 0; i < inlineModule_.size(); i++) {
output.writeMessage(9, inlineModule_.get(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); output.writeRawBytes(unknownFields);
} }
@@ -30316,6 +30476,18 @@ public final class JsAstProtoBuf {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(9, inlineModule_.get(i)); .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(); size += unknownFields.size();
memoizedSerializedSize = size; memoizedSerializedSize = size;
return size; return size;
@@ -30428,6 +30600,12 @@ public final class JsAstProtoBuf {
bitField0_ = (bitField0_ & ~0x00000080); bitField0_ = (bitField0_ & ~0x00000080);
inlineModule_ = java.util.Collections.emptyList(); inlineModule_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000100); 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; return this;
} }
@@ -30493,6 +30671,18 @@ public final class JsAstProtoBuf {
bitField0_ = (bitField0_ & ~0x00000100); bitField0_ = (bitField0_ & ~0x00000100);
} }
result.inlineModule_ = inlineModule_; 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_; result.bitField0_ = to_bitField0_;
return result; 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( setUnknownFields(
getUnknownFields().concat(other.unknownFields)); getUnknownFields().concat(other.unknownFields));
return this; return this;
@@ -30628,6 +30829,18 @@ public final class JsAstProtoBuf {
return false; return false;
} }
} }
if (hasTestsInvocation()) {
if (!getTestsInvocation().isInitialized()) {
return false;
}
}
if (hasMainInvocation()) {
if (!getMainInvocation().isInitialized()) {
return false;
}
}
return true; return true;
} }
@@ -31580,6 +31793,202 @@ public final class JsAstProtoBuf {
return this; return this;
} }
private java.lang.Object packageFqn_ = "";
/**
* <code>optional string package_fqn = 10;</code>
*/
public boolean hasPackageFqn() {
return ((bitField0_ & 0x00000200) == 0x00000200);
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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;
}
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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;
}
}
/**
* <code>optional string package_fqn = 10;</code>
*/
public Builder setPackageFqn(
java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000200;
packageFqn_ = value;
return this;
}
/**
* <code>optional string package_fqn = 10;</code>
*/
public Builder clearPackageFqn() {
bitField0_ = (bitField0_ & ~0x00000200);
packageFqn_ = getDefaultInstance().getPackageFqn();
return this;
}
/**
* <code>optional string package_fqn = 10;</code>
*/
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();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public boolean hasTestsInvocation() {
return ((bitField0_ & 0x00000400) == 0x00000400);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getTestsInvocation() {
return testsInvocation_;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public Builder setTestsInvocation(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement value) {
if (value == null) {
throw new NullPointerException();
}
testsInvocation_ = value;
bitField0_ |= 0x00000400;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
public Builder setTestsInvocation(
org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.Builder builderForValue) {
testsInvocation_ = builderForValue.build();
bitField0_ |= 0x00000400;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement tests_invocation = 11;</code>
*/
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();
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public boolean hasMainInvocation() {
return ((bitField0_ & 0x00000800) == 0x00000800);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement getMainInvocation() {
return mainInvocation_;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public Builder setMainInvocation(org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement value) {
if (value == null) {
throw new NullPointerException();
}
mainInvocation_ = value;
bitField0_ |= 0x00000800;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
public Builder setMainInvocation(
org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.Builder builderForValue) {
mainInvocation_ = builderForValue.build();
bitField0_ |= 0x00000800;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
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;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.js.ast.Statement main_invocation = 12;</code>
*/
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) // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.ast.Fragment)
} }
@@ -62,6 +62,8 @@ class JsAstSerializer(private val pathResolver: (File) -> String) {
private fun serializeFragment(fragment: JsProgramFragment): Fragment { private fun serializeFragment(fragment: JsProgramFragment): Fragment {
val fragmentBuilder = Fragment.newBuilder() val fragmentBuilder = Fragment.newBuilder()
fragmentBuilder.packageFqn = fragment.packageFqn
for (importedModule in fragment.importedModules) { for (importedModule in fragment.importedModules) {
val importedModuleBuilder = ImportedModule.newBuilder() val importedModuleBuilder = ImportedModule.newBuilder()
importedModuleBuilder.externalNameId = serialize(importedModule.externalName) importedModuleBuilder.externalNameId = serialize(importedModule.externalName)
@@ -102,6 +104,14 @@ class JsAstSerializer(private val pathResolver: (File) -> String) {
fragmentBuilder.addInlineModule(inlineModuleBuilder) fragmentBuilder.addInlineModule(inlineModuleBuilder)
} }
fragment.tests?.let {
fragmentBuilder.setTestsInvocation(serialize(it))
}
fragment.mainFunction?.let {
fragmentBuilder.setMainInvocation(serialize(it))
}
return fragmentBuilder.build() return fragmentBuilder.build()
} }
@@ -158,11 +158,12 @@ public final class StaticContext {
@NotNull BindingTrace bindingTrace, @NotNull BindingTrace bindingTrace,
@NotNull JsConfig config, @NotNull JsConfig config,
@NotNull ModuleDescriptor moduleDescriptor, @NotNull ModuleDescriptor moduleDescriptor,
@NotNull SourceFilePathResolver sourceFilePathResolver @NotNull SourceFilePathResolver sourceFilePathResolver,
@NotNull String packageFqn
) { ) {
program = new JsProgram(); program = new JsProgram();
JsFunction rootFunction = JsAstUtils.createFunctionWithEmptyBody(program.getScope()); JsFunction rootFunction = JsAstUtils.createFunctionWithEmptyBody(program.getScope());
fragment = new JsProgramFragment(rootFunction.getScope()); fragment = new JsProgramFragment(rootFunction.getScope(), packageFqn);
this.bindingTrace = bindingTrace; this.bindingTrace = bindingTrace;
this.namer = Namer.newInstance(program.getRootScope()); this.namer = Namer.newInstance(program.getRootScope());
@@ -34,6 +34,8 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
val importBlock = JsGlobalBlock() val importBlock = JsGlobalBlock()
private val declarationBlock = JsGlobalBlock() private val declarationBlock = JsGlobalBlock()
private val initializerBlock = JsGlobalBlock() private val initializerBlock = JsGlobalBlock()
private val testsMap = mutableMapOf<String, JsStatement>()
private var mainFn: Pair<String, JsStatement>? = null
private val exportBlock = JsGlobalBlock() private val exportBlock = JsGlobalBlock()
private val declaredImports = mutableSetOf<String>() private val declaredImports = mutableSetOf<String>()
private val classes = mutableMapOf<JsName, JsClassModel>() private val classes = mutableMapOf<JsName, JsClassModel>()
@@ -55,11 +57,42 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
declarationBlock.statements += fragment.declarationBlock declarationBlock.statements += fragment.declarationBlock
initializerBlock.statements += fragment.initializerBlock initializerBlock.statements += fragment.initializerBlock
fragment.tryUpdateTests()
fragment.tryUpdateMain()
addExportStatements(fragment) addExportStatements(fragment)
classes += fragment.classes 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<JsImportedModule> val importedModules: List<JsImportedModule>
get() = importedModulesImpl get() = importedModulesImpl
@@ -136,6 +169,9 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
fragment.classes += classes.map { it.name to it } fragment.classes += classes.map { it.name to it }
fragment.inlineModuleMap.forEach { (_, value) -> rename(value) } fragment.inlineModuleMap.forEach { (_, value) -> rename(value) }
fragment.tests?.let { rename(it) }
fragment.mainFunction?.let { rename(it) }
} }
private fun <T: JsNode> Map<JsName, JsName>.rename(rootNode: T): T { private fun <T: JsNode> Map<JsName, JsName>.rename(rootNode: T): T {
@@ -174,6 +210,8 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
this += exportBlock.statements this += exportBlock.statements
addClassPostDeclarations(this) addClassPostDeclarations(this)
this += initializerBlock.statements this += initializerBlock.statements
this += testsMap.values
mainFn?.second?.let { this += it }
} }
} }
@@ -340,15 +340,21 @@ public final class Translation {
for (TranslationUnit unit : units) { for (TranslationUnit unit : units) {
if (unit instanceof TranslationUnit.SourceFile) { if (unit instanceof TranslationUnit.SourceFile) {
KtFile file = ((TranslationUnit.SourceFile) unit).getFile(); 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); TranslationContext context = TranslationContext.rootContext(staticContext);
List<DeclarationDescriptor> fileMemberScope = new ArrayList<>(); List<DeclarationDescriptor> fileMemberScope = new ArrayList<>();
translateFile(context, file, fileMemberScope); translateFile(context, file, fileMemberScope);
fragments.add(staticContext.getFragment());
newFragments.add(staticContext.getFragment()); JsProgramFragment fragment = staticContext.getFragment();
fragmentMap.put(file, 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); fileMemberScopes.put(file, fileMemberScope);
merger.addFragment(staticContext.getFragment()); merger.addFragment(fragment);
} }
else if (unit instanceof TranslationUnit.BinaryAst) { else if (unit instanceof TranslationUnit.BinaryAst) {
byte[] astData = ((TranslationUnit.BinaryAst) unit).getData(); 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)); 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(); merger.merge();
JsBlock rootBlock = rootFunction.getBody(); JsBlock rootBlock = rootFunction.getBody();
@@ -447,30 +439,36 @@ public final class Translation {
} }
} }
@NotNull @Nullable
private static JsProgramFragment mayBeGenerateTests( private static JsStatement mayBeGenerateTests(
@NotNull JsConfig config, @NotNull BindingTrace trace, @NotNull TranslationContext context,
@NotNull ModuleDescriptor moduleDescriptor, @NotNull SourceFilePathResolver sourceFilePathResolver @NotNull KtFile file,
@NotNull List<DeclarationDescriptor> fileMemberScope
) { ) {
StaticContext staticContext = new StaticContext(trace, config, moduleDescriptor, sourceFilePathResolver); return new JSTestGenerator(context).generateTestCalls(file, fileMemberScope);
TranslationContext context = TranslationContext.rootContext(staticContext);
new JSTestGenerator(context).generateTestCalls(moduleDescriptor);
return staticContext.getFragment();
} }
//TODO: determine whether should throw exception //TODO: determine whether should throw exception
@Nullable @Nullable
private static JsProgramFragment generateCallToMain( private static JsStatement maybeGenerateCallToMain(
@NotNull BindingTrace trace, @NotNull JsConfig config, @NotNull ModuleDescriptor moduleDescriptor, @NotNull TranslationContext context,
@NotNull SourceFilePathResolver sourceFilePathResolver, @NotNull JsConfig config,
@NotNull List<String> arguments @NotNull ModuleDescriptor moduleDescriptor,
@NotNull List<DeclarationDescriptor> fileMemberScope,
@NotNull MainCallParameters mainCallParameters
) { ) {
StaticContext staticContext = new StaticContext(trace, config, moduleDescriptor, sourceFilePathResolver); if (!mainCallParameters.shouldBeGenerated()) return null;
TranslationContext context = TranslationContext.rootContext(staticContext);
MainFunctionDetector mainFunctionDetector = new MainFunctionDetector(context.bindingContext(), config.getLanguageVersionSettings()); 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) { if (functionDescriptor == null) {
return null; return null;
} }
@@ -480,7 +478,7 @@ public final class Translation {
List<JsExpression> args = new ArrayList<>(); List<JsExpression> args = new ArrayList<>();
if (parameterCount != 0) { if (parameterCount != 0) {
args.add(new JsArrayLiteral(toStringLiteralList(arguments))); args.add(new JsArrayLiteral(toStringLiteralList(mainCallParameters.arguments())));
} }
if (functionDescriptor.isSuspend()) { if (functionDescriptor.isSuspend()) {
@@ -492,7 +490,6 @@ public final class Translation {
} }
JsExpression call = CallTranslator.INSTANCE.buildCall(context, functionDescriptor, args, null); JsExpression call = CallTranslator.INSTANCE.buildCall(context, functionDescriptor, args, null);
context.addTopLevelStatement(call.makeStmt()); return call.makeStmt();
return staticContext.getFragment();
} }
} }
@@ -24,14 +24,25 @@ import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
class JSTestGenerator(val context: TranslationContext) { class JSTestGenerator(val context: TranslationContext) {
fun generateTestCalls(moduleDescriptor: ModuleDescriptor) { fun generateTestCalls(file: KtFile, fileMemberScope: List<DeclarationDescriptor>): JsStatement? {
generateTestCalls(moduleDescriptor, FqName.ROOT) 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) { private fun generateTestCalls(moduleDescriptor: ModuleDescriptor, packageName: FqName) {