From 0238b182ccde6babe7300afadb8c2315cb0ad49c Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 1 Jul 2016 16:47:40 +0300 Subject: [PATCH] KT-12877: add JsNonModule with support on front-end --- .../serialization/js/DebugJsProtoBuf.java | 791 +++++++++++++++++- .../module/wrongCallToModule.kt | 39 + .../module/wrongCallToModule.txt | 43 + .../module/wrongCallToNonModule.kt | 33 + .../module/wrongCallToNonModule.txt | 34 + .../checkers/AbstractDiagnosticsTest.java | 6 + .../AbstractDiagnosticsTestWithJsStdLib.java | 38 +- .../DiagnosticsTestWithJsStdLibGenerated.java | 12 + .../js/analyze/TopDownAnalyzerFacadeForJS.kt | 6 +- .../js/resolve/JsPlatformConfigurator.kt | 2 +- .../js/resolve/bindingContextSlicesJs.kt | 24 + .../diagnostics/DefaultErrorMessagesJs.kt | 4 + .../js/resolve/diagnostics/ErrorsJs.java | 2 + .../diagnostics/JsModuleCallChecker.kt | 71 ++ .../js/translate/utils/AnnotationsUtils.java | 23 +- js/js.libraries/src/core/annotations.kt | 6 +- js/js.serializer/src/js.proto | 4 + .../kotlin/serialization/js/JsProtoBuf.java | 493 +++++++++++ .../js/KotlinJavascriptPackageFragment.kt | 6 +- .../js/KotlinJavascriptSerializationUtil.kt | 1 - 20 files changed, 1581 insertions(+), 57 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.txt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.txt create mode 100644 js/js.frontend/src/org/jetbrains/kotlin/js/resolve/bindingContextSlicesJs.kt create mode 100644 js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsModuleCallChecker.kt diff --git a/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java b/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java index 86adbd11b68..193d2437993 100644 --- a/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java @@ -797,6 +797,694 @@ public final class DebugJsProtoBuf { // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.serialization.js.File) } + public interface FilesOrBuilder extends + // @@protoc_insertion_point(interface_extends:org.jetbrains.kotlin.serialization.js.Files) + org.jetbrains.kotlin.protobuf.MessageOrBuilder { + + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + java.util.List + getFileList(); + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File getFile(int index); + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + int getFileCount(); + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + java.util.List + getFileOrBuilderList(); + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.FileOrBuilder getFileOrBuilder( + int index); + } + /** + * Protobuf type {@code org.jetbrains.kotlin.serialization.js.Files} + */ + public static final class Files extends + org.jetbrains.kotlin.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:org.jetbrains.kotlin.serialization.js.Files) + FilesOrBuilder { + // Use Files.newBuilder() to construct. + private Files(org.jetbrains.kotlin.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Files(boolean noInit) { this.unknownFields = org.jetbrains.kotlin.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Files defaultInstance; + public static Files getDefaultInstance() { + return defaultInstance; + } + + public Files getDefaultInstanceForType() { + return defaultInstance; + } + + private final org.jetbrains.kotlin.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final org.jetbrains.kotlin.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Files( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + org.jetbrains.kotlin.protobuf.UnknownFieldSet.Builder unknownFields = + org.jetbrains.kotlin.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + file_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + file_.add(input.readMessage(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.PARSER, extensionRegistry)); + break; + } + } + } + } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + file_ = java.util.Collections.unmodifiableList(file_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final org.jetbrains.kotlin.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.internal_static_org_jetbrains_kotlin_serialization_js_Files_descriptor; + } + + protected org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.internal_static_org_jetbrains_kotlin_serialization_js_Files_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files.class, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files.Builder.class); + } + + public static org.jetbrains.kotlin.protobuf.Parser PARSER = + new org.jetbrains.kotlin.protobuf.AbstractParser() { + public Files parsePartialFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return new Files(input, extensionRegistry); + } + }; + + @java.lang.Override + public org.jetbrains.kotlin.protobuf.Parser getParserForType() { + return PARSER; + } + + public static final int FILE_FIELD_NUMBER = 1; + private java.util.List file_; + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List getFileList() { + return file_; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List + getFileOrBuilderList() { + return file_; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public int getFileCount() { + return file_.size(); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File getFile(int index) { + return file_.get(index); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.FileOrBuilder getFileOrBuilder( + int index) { + return file_.get(index); + } + + private void initFields() { + file_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getFileCount(); i++) { + if (!getFile(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(org.jetbrains.kotlin.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < file_.size(); i++) { + output.writeMessage(1, file_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < file_.size(); i++) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeMessageSize(1, file_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.ByteString data) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.ByteString data, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom(byte[] data) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom( + byte[] data, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom( + java.io.InputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseDelimitedFrom( + java.io.InputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + org.jetbrains.kotlin.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code org.jetbrains.kotlin.serialization.js.Files} + */ + public static final class Builder extends + org.jetbrains.kotlin.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:org.jetbrains.kotlin.serialization.js.Files) + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.FilesOrBuilder { + public static final org.jetbrains.kotlin.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.internal_static_org_jetbrains_kotlin_serialization_js_Files_descriptor; + } + + protected org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.internal_static_org_jetbrains_kotlin_serialization_js_Files_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files.class, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files.Builder.class); + } + + // Construct using org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + org.jetbrains.kotlin.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (org.jetbrains.kotlin.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getFileFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (fileBuilder_ == null) { + file_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + fileBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public org.jetbrains.kotlin.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.internal_static_org_jetbrains_kotlin_serialization_js_Files_descriptor; + } + + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files getDefaultInstanceForType() { + return org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files.getDefaultInstance(); + } + + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files build() { + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files buildPartial() { + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files result = new org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files(this); + int from_bitField0_ = bitField0_; + if (fileBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001)) { + file_ = java.util.Collections.unmodifiableList(file_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.file_ = file_; + } else { + result.file_ = fileBuilder_.build(); + } + onBuilt(); + return result; + } + + public Builder mergeFrom(org.jetbrains.kotlin.protobuf.Message other) { + if (other instanceof org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files) { + return mergeFrom((org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files other) { + if (other == org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files.getDefaultInstance()) return this; + if (fileBuilder_ == null) { + if (!other.file_.isEmpty()) { + if (file_.isEmpty()) { + file_ = other.file_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureFileIsMutable(); + file_.addAll(other.file_); + } + onChanged(); + } + } else { + if (!other.file_.isEmpty()) { + if (fileBuilder_.isEmpty()) { + fileBuilder_.dispose(); + fileBuilder_ = null; + file_ = other.file_; + bitField0_ = (bitField0_ & ~0x00000001); + fileBuilder_ = + org.jetbrains.kotlin.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getFileFieldBuilder() : null; + } else { + fileBuilder_.addAllMessages(other.file_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + for (int i = 0; i < getFileCount(); i++) { + if (!getFile(i).isInitialized()) { + + return false; + } + } + return true; + } + + public Builder mergeFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Files) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List file_ = + java.util.Collections.emptyList(); + private void ensureFileIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + file_ = new java.util.ArrayList(file_); + bitField0_ |= 0x00000001; + } + } + + private org.jetbrains.kotlin.protobuf.RepeatedFieldBuilder< + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.FileOrBuilder> fileBuilder_; + + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List getFileList() { + if (fileBuilder_ == null) { + return java.util.Collections.unmodifiableList(file_); + } else { + return fileBuilder_.getMessageList(); + } + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public int getFileCount() { + if (fileBuilder_ == null) { + return file_.size(); + } else { + return fileBuilder_.getCount(); + } + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File getFile(int index) { + if (fileBuilder_ == null) { + return file_.get(index); + } else { + return fileBuilder_.getMessage(index); + } + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder setFile( + int index, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File value) { + if (fileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFileIsMutable(); + file_.set(index, value); + onChanged(); + } else { + fileBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder setFile( + int index, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder builderForValue) { + if (fileBuilder_ == null) { + ensureFileIsMutable(); + file_.set(index, builderForValue.build()); + onChanged(); + } else { + fileBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File value) { + if (fileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFileIsMutable(); + file_.add(value); + onChanged(); + } else { + fileBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile( + int index, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File value) { + if (fileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFileIsMutable(); + file_.add(index, value); + onChanged(); + } else { + fileBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile( + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder builderForValue) { + if (fileBuilder_ == null) { + ensureFileIsMutable(); + file_.add(builderForValue.build()); + onChanged(); + } else { + fileBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile( + int index, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder builderForValue) { + if (fileBuilder_ == null) { + ensureFileIsMutable(); + file_.add(index, builderForValue.build()); + onChanged(); + } else { + fileBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addAllFile( + java.lang.Iterable values) { + if (fileBuilder_ == null) { + ensureFileIsMutable(); + org.jetbrains.kotlin.protobuf.AbstractMessageLite.Builder.addAll( + values, file_); + onChanged(); + } else { + fileBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder clearFile() { + if (fileBuilder_ == null) { + file_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + fileBuilder_.clear(); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder removeFile(int index) { + if (fileBuilder_ == null) { + ensureFileIsMutable(); + file_.remove(index); + onChanged(); + } else { + fileBuilder_.remove(index); + } + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder getFileBuilder( + int index) { + return getFileFieldBuilder().getBuilder(index); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.FileOrBuilder getFileOrBuilder( + int index) { + if (fileBuilder_ == null) { + return file_.get(index); } else { + return fileBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List + getFileOrBuilderList() { + if (fileBuilder_ != null) { + return fileBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(file_); + } + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder addFileBuilder() { + return getFileFieldBuilder().addBuilder( + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.getDefaultInstance()); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder addFileBuilder( + int index) { + return getFileFieldBuilder().addBuilder( + index, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.getDefaultInstance()); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List + getFileBuilderList() { + return getFileFieldBuilder().getBuilderList(); + } + private org.jetbrains.kotlin.protobuf.RepeatedFieldBuilder< + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.FileOrBuilder> + getFileFieldBuilder() { + if (fileBuilder_ == null) { + fileBuilder_ = new org.jetbrains.kotlin.protobuf.RepeatedFieldBuilder< + org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.File.Builder, org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.FileOrBuilder>( + file_, + ((bitField0_ & 0x00000001) == 0x00000001), + getParentForChildren(), + isClean()); + file_ = null; + } + return fileBuilder_; + } + + // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.Files) + } + + static { + defaultInstance = new Files(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.serialization.js.Files) + } + public interface ClassesOrBuilder extends // @@protoc_insertion_point(interface_extends:org.jetbrains.kotlin.serialization.js.Classes) org.jetbrains.kotlin.protobuf.MessageOrBuilder { @@ -3101,6 +3789,11 @@ public final class DebugJsProtoBuf { private static org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable internal_static_org_jetbrains_kotlin_serialization_js_File_fieldAccessorTable; + private static final org.jetbrains.kotlin.protobuf.Descriptors.Descriptor + internal_static_org_jetbrains_kotlin_serialization_js_Files_descriptor; + private static + org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_org_jetbrains_kotlin_serialization_js_Files_fieldAccessorTable; private static final org.jetbrains.kotlin.protobuf.Descriptors.Descriptor internal_static_org_jetbrains_kotlin_serialization_js_Classes_descriptor; private static @@ -3130,50 +3823,52 @@ public final class DebugJsProtoBuf { "re/deserialization/src/descriptors.debug" + ".proto\"V\n\004File\022\n\n\002id\030\001 \002(\005\022B\n\nannotation" + "\030\002 \003(\0132..org.jetbrains.kotlin.serializat" + - "ion.Annotation\"!\n\007Classes\022\026\n\nclass_name\030" + - "\001 \003(\005B\002\020\001\"\225\002\n\007Library\022G\n\005entry\030\001 \003(\01328.o" + - "rg.jetbrains.kotlin.serialization.js.Lib" + - "rary.FileEntry\022H\n\004kind\030\002 \001(\01623.org.jetbr" + - "ains.kotlin.serialization.js.Library.Kin", - "d:\005PLAIN\022\027\n\017imported_module\030\003 \003(\t\032*\n\tFil" + - "eEntry\022\014\n\004path\030\001 \002(\t\022\017\n\007content\030\002 \002(\014\"2\n" + - "\004Kind\022\t\n\005PLAIN\020\001\022\007\n\003AMD\020\002\022\r\n\tCOMMON_JS\020\003" + - "\022\007\n\003UMD\020\004:t\n\020class_annotation\022).org.jetb" + - "rains.kotlin.serialization.Class\030\202\001 \003(\0132" + - "..org.jetbrains.kotlin.serialization.Ann" + - "otation:L\n\030class_containing_file_id\022).or" + - "g.jetbrains.kotlin.serialization.Class\030\207" + - "\001 \001(\005:\200\001\n\026constructor_annotation\022/.org.j" + - "etbrains.kotlin.serialization.Constructo", - "r\030\202\001 \003(\0132..org.jetbrains.kotlin.serializ" + - "ation.Annotation:z\n\023function_annotation\022" + + "ion.Annotation\"B\n\005Files\0229\n\004file\030\001 \003(\0132+." + + "org.jetbrains.kotlin.serialization.js.Fi" + + "le\"!\n\007Classes\022\026\n\nclass_name\030\001 \003(\005B\002\020\001\"\225\002" + + "\n\007Library\022G\n\005entry\030\001 \003(\01328.org.jetbrains" + + ".kotlin.serialization.js.Library.FileEnt", + "ry\022H\n\004kind\030\002 \001(\01623.org.jetbrains.kotlin." + + "serialization.js.Library.Kind:\005PLAIN\022\027\n\017" + + "imported_module\030\003 \003(\t\032*\n\tFileEntry\022\014\n\004pa" + + "th\030\001 \002(\t\022\017\n\007content\030\002 \002(\014\"2\n\004Kind\022\t\n\005PLA" + + "IN\020\001\022\007\n\003AMD\020\002\022\r\n\tCOMMON_JS\020\003\022\007\n\003UMD\020\004:t\n" + + "\020class_annotation\022).org.jetbrains.kotlin" + + ".serialization.Class\030\202\001 \003(\0132..org.jetbra" + + "ins.kotlin.serialization.Annotation:L\n\030c" + + "lass_containing_file_id\022).org.jetbrains." + + "kotlin.serialization.Class\030\207\001 \001(\005:\200\001\n\026co", + "nstructor_annotation\022/.org.jetbrains.kot" + + "lin.serialization.Constructor\030\202\001 \003(\0132..o" + + "rg.jetbrains.kotlin.serialization.Annota" + + "tion:z\n\023function_annotation\022,.org.jetbra" + + "ins.kotlin.serialization.Function\030\202\001 \003(\013" + + "2..org.jetbrains.kotlin.serialization.An" + + "notation:R\n\033function_containing_file_id\022" + ",.org.jetbrains.kotlin.serialization.Fun" + - "ction\030\202\001 \003(\0132..org.jetbrains.kotlin.seri" + - "alization.Annotation:R\n\033function_contain" + - "ing_file_id\022,.org.jetbrains.kotlin.seria" + - "lization.Function\030\207\001 \001(\005:z\n\023property_ann" + - "otation\022,.org.jetbrains.kotlin.serializa" + - "tion.Property\030\202\001 \003(\0132..org.jetbrains.kot" + - "lin.serialization.Annotation:\210\001\n\022compile", - "_time_value\022,.org.jetbrains.kotlin.seria" + - "lization.Property\030\203\001 \001(\0132=.org.jetbrains" + - ".kotlin.serialization.Annotation.Argumen" + - "t.Value:R\n\033property_containing_file_id\022," + - ".org.jetbrains.kotlin.serialization.Prop" + - "erty\030\207\001 \001(\005:}\n\025enum_entry_annotation\022-.o" + - "rg.jetbrains.kotlin.serialization.EnumEn" + - "try\030\202\001 \003(\0132..org.jetbrains.kotlin.serial" + - "ization.Annotation:\201\001\n\024parameter_annotat" + - "ion\0222.org.jetbrains.kotlin.serialization", - ".ValueParameter\030\202\001 \003(\0132..org.jetbrains.k" + - "otlin.serialization.Annotation:r\n\017type_a" + - "nnotation\022(.org.jetbrains.kotlin.seriali" + - "zation.Type\030\202\001 \003(\0132..org.jetbrains.kotli" + - "n.serialization.Annotation:\205\001\n\031type_para" + - "meter_annotation\0221.org.jetbrains.kotlin." + - "serialization.TypeParameter\030\202\001 \003(\0132..org" + - ".jetbrains.kotlin.serialization.Annotati" + - "onB\021B\017DebugJsProtoBuf" + "ction\030\207\001 \001(\005:z\n\023property_annotation\022,.or" + + "g.jetbrains.kotlin.serialization.Propert", + "y\030\202\001 \003(\0132..org.jetbrains.kotlin.serializ" + + "ation.Annotation:\210\001\n\022compile_time_value\022" + + ",.org.jetbrains.kotlin.serialization.Pro" + + "perty\030\203\001 \001(\0132=.org.jetbrains.kotlin.seri" + + "alization.Annotation.Argument.Value:R\n\033p" + + "roperty_containing_file_id\022,.org.jetbrai" + + "ns.kotlin.serialization.Property\030\207\001 \001(\005:" + + "}\n\025enum_entry_annotation\022-.org.jetbrains" + + ".kotlin.serialization.EnumEntry\030\202\001 \003(\0132." + + ".org.jetbrains.kotlin.serialization.Anno", + "tation:\201\001\n\024parameter_annotation\0222.org.je" + + "tbrains.kotlin.serialization.ValueParame" + + "ter\030\202\001 \003(\0132..org.jetbrains.kotlin.serial" + + "ization.Annotation:r\n\017type_annotation\022(." + + "org.jetbrains.kotlin.serialization.Type\030" + + "\202\001 \003(\0132..org.jetbrains.kotlin.serializat" + + "ion.Annotation:\205\001\n\031type_parameter_annota" + + "tion\0221.org.jetbrains.kotlin.serializatio" + + "n.TypeParameter\030\202\001 \003(\0132..org.jetbrains.k" + + "otlin.serialization.AnnotationB\021B\017DebugJ", + "sProtoBuf" }; org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -3194,14 +3889,20 @@ public final class DebugJsProtoBuf { org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_org_jetbrains_kotlin_serialization_js_File_descriptor, new java.lang.String[] { "Id", "Annotation", }); - internal_static_org_jetbrains_kotlin_serialization_js_Classes_descriptor = + internal_static_org_jetbrains_kotlin_serialization_js_Files_descriptor = getDescriptor().getMessageTypes().get(1); + internal_static_org_jetbrains_kotlin_serialization_js_Files_fieldAccessorTable = new + org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_org_jetbrains_kotlin_serialization_js_Files_descriptor, + new java.lang.String[] { "File", }); + internal_static_org_jetbrains_kotlin_serialization_js_Classes_descriptor = + getDescriptor().getMessageTypes().get(2); internal_static_org_jetbrains_kotlin_serialization_js_Classes_fieldAccessorTable = new org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_org_jetbrains_kotlin_serialization_js_Classes_descriptor, new java.lang.String[] { "ClassName", }); internal_static_org_jetbrains_kotlin_serialization_js_Library_descriptor = - getDescriptor().getMessageTypes().get(2); + getDescriptor().getMessageTypes().get(3); internal_static_org_jetbrains_kotlin_serialization_js_Library_fieldAccessorTable = new org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_org_jetbrains_kotlin_serialization_js_Library_descriptor, diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.kt b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.kt new file mode 100644 index 00000000000..f19982f052b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.kt @@ -0,0 +1,39 @@ +// MODULE: m1 +// FILE: a.kt +package foo + +import kotlin.js.* + +@JsModule("A") @native object A { + fun f(): Int + + val g: Int +} + +@JsModule("B") @native open class B { + fun foo(): Int +} + +@JsModule("bar") @native fun bar(): Unit + +// MODULE: m2(m1) +// FILE: b.kt +// TODO: it's hard to test @JsNonModule on file from an external module +@file:JsModule("foo") +package foo + +@native fun baz(): Unit + +// FILE: c.kt +package bar + +import foo.* + +fun box() { + A.f()+A.g + B() + bar() + baz() +} + +@native class DerivedB : B() \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.txt b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.txt new file mode 100644 index 00000000000..856a428fa57 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.txt @@ -0,0 +1,43 @@ +// -- Module: -- +package + +package foo { + @kotlin.js.JsModule(import = "bar") @kotlin.js.native public fun bar(): kotlin.Unit + + @kotlin.js.JsModule(import = "A") @kotlin.js.native public object A { + private constructor A() + public final val g: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun f(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.js.JsModule(import = "B") @kotlin.js.native public open class B { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + + +// -- Module: -- +package + +package bar { + public fun box(): kotlin.Unit + + @kotlin.js.native public final class DerivedB : foo.B { + public constructor DerivedB() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun foo(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +package foo { + @kotlin.js.native public fun baz(): kotlin.Unit +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.kt b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.kt new file mode 100644 index 00000000000..d54a443494c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.kt @@ -0,0 +1,33 @@ +// MODULE: m1 +// FILE: a.kt +package foo + +import kotlin.js.* + +@JsNonModule @native object A { + fun f(): Int + + val g: Int +} + +@JsNonModule @native open class B { + fun foo(): Int +} + +@JsNonModule @native fun bar(): Unit + +// MODULE: m2(m1) +// MODULE_KIND: AMD +// TODO: it's hard to test @JsNonModule on file from an external module +// FILE: c.kt +package bar + +import foo.* + +fun box() { + A.f()+A.g + B() + bar() +} + +@native class DerivedB : B() \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.txt b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.txt new file mode 100644 index 00000000000..35636a9db1c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.txt @@ -0,0 +1,34 @@ +package + +package bar { + public fun box(): kotlin.Unit + + @kotlin.js.native public final class DerivedB : foo.B { + public constructor DerivedB() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun foo(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +package foo { + @kotlin.js.JsNonModule @kotlin.js.native public fun bar(): kotlin.Unit + + @kotlin.js.JsNonModule @kotlin.js.native public object A { + private constructor A() + public final val g: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun f(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.js.JsNonModule @kotlin.js.native public open class B { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java index e8053b6b3b4..40b5883d118 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java @@ -537,12 +537,18 @@ public abstract class AbstractDiagnosticsTest extends BaseDiagnosticsTest { } dependencies.add(module.getBuiltIns().getBuiltInsModule()); + dependencies.addAll(getAdditionalDependencies(module)); module.setDependencies(dependencies); } return modules; } + @NotNull + protected List getAdditionalDependencies(@NotNull ModuleDescriptorImpl module) { + return Collections.emptyList(); + } + @NotNull @SuppressWarnings("unchecked") protected ModuleDescriptorImpl createModule(@NotNull String moduleName, @NotNull StorageManager storageManager) { diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.java b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.java index 691390b304d..19064468ef9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.java @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.checkers; +import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; @@ -29,11 +30,13 @@ import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult; import org.jetbrains.kotlin.js.config.JSConfigurationKeys; import org.jetbrains.kotlin.js.config.JsConfig; import org.jetbrains.kotlin.js.config.LibrarySourcesConfig; +import org.jetbrains.kotlin.js.resolve.BindingContextSlicesJsKt; import org.jetbrains.kotlin.js.resolve.JsPlatform; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.serialization.js.JsModuleDescriptor; +import org.jetbrains.kotlin.serialization.js.ModuleKind; import org.jetbrains.kotlin.storage.StorageManager; import org.jetbrains.kotlin.test.KotlinTestUtils; @@ -77,9 +80,40 @@ public abstract class AbstractDiagnosticsTestWithJsStdLib extends AbstractDiagno // TODO: support LANGUAGE directive in JS diagnostic tests assert languageVersionSettings == null : BaseDiagnosticsTest.LANGUAGE_DIRECTIVE + " directive is not supported in JS diagnostic tests"; + moduleTrace.record(BindingContextSlicesJsKt.MODULE_KIND, moduleContext.getModule(), getModuleKind(ktFiles)); return TopDownAnalyzerFacadeForJS.analyzeFilesWithGivenTrace(ktFiles, moduleTrace, moduleContext, config); } + @NotNull + private static ModuleKind getModuleKind(@NotNull List ktFiles) { + ModuleKind kind = ModuleKind.PLAIN; + for (KtFile file : ktFiles) { + String text = file.getText(); + for (String line : StringUtil.splitByLines(text)) { + line = line.trim(); + if (!line.startsWith("//")) continue; + line = line.substring(2).trim(); + List parts = StringUtil.split(line, ":"); + if (parts.size() != 2) continue; + + if (!parts.get(0).trim().equals("MODULE_KIND")) continue; + kind = ModuleKind.valueOf(parts.get(1).trim()); + } + } + + return kind; + } + + @Override + @NotNull + protected List getAdditionalDependencies(@NotNull ModuleDescriptorImpl module) { + List dependencies = new ArrayList(); + for (JsModuleDescriptor moduleDescriptor : config.getModuleDescriptors()) { + dependencies.add(moduleDescriptor.getData()); + } + return dependencies; + } + @Override public boolean shouldSkipJvmSignatureDiagnostics(Map> groupedByModule) { return true; @@ -99,9 +133,7 @@ public abstract class AbstractDiagnosticsTestWithJsStdLib extends AbstractDiagno List dependencies = new ArrayList(); dependencies.add(module); - for (JsModuleDescriptor moduleDescriptor : config.getModuleDescriptors()) { - dependencies.add(moduleDescriptor.getData()); - } + dependencies.addAll(getAdditionalDependencies(module)); dependencies.add(module.getBuiltIns().getBuiltInsModule()); module.setDependencies(dependencies); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index dc0ab31bc1b..e71093a4158 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -316,6 +316,18 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/module/prohibitedOnNonNative.kt"); doTest(fileName); } + + @TestMetadata("wrongCallToModule.kt") + public void testWrongCallToModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.kt"); + doTest(fileName); + } + + @TestMetadata("wrongCallToNonModule.kt") + public void testWrongCallToNonModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name") diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt index fa4f8c341ac..6e8c02185d3 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.js.analyze +import com.intellij.openapi.util.text.StringUtil import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.context.ContextForNewModule @@ -25,6 +26,7 @@ import org.jetbrains.kotlin.frontend.js.di.createTopDownAnalyzerForJs import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.resolve.JsPlatform +import org.jetbrains.kotlin.js.resolve.MODULE_KIND import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.* @@ -39,7 +41,9 @@ object TopDownAnalyzerFacadeForJS { config.moduleDescriptors.map { it.data } + listOf(JsPlatform.builtIns.builtInsModule) ) - return analyzeFilesWithGivenTrace(files, BindingTraceContext(), context, config) + val trace = BindingTraceContext() + trace.record(MODULE_KIND, context.module, config.moduleKind) + return analyzeFilesWithGivenTrace(files, trace, context, config) } @JvmStatic diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt index 28b55e5799b..1a92fdb6bf7 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt @@ -37,7 +37,7 @@ object JsPlatformConfigurator : PlatformConfigurator( JsNameChecker, JsModuleChecker, PlatformImplDeclarationChecker() ), - additionalCallCheckers = listOf(ReifiedTypeParameterSubstitutionChecker()), + additionalCallCheckers = listOf(ReifiedTypeParameterSubstitutionChecker(), JsModuleCallChecker), additionalTypeCheckers = listOf(), additionalClassifierUsageCheckers = listOf(), additionalAnnotationCheckers = listOf(), diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/bindingContextSlicesJs.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/bindingContextSlicesJs.kt new file mode 100644 index 00000000000..95eb8f52e1f --- /dev/null +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/bindingContextSlicesJs.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.js.resolve + +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.serialization.js.ModuleKind +import org.jetbrains.kotlin.util.slicedMap.BasicWritableSlice +import org.jetbrains.kotlin.util.slicedMap.RewritePolicy + +@JvmField val MODULE_KIND = BasicWritableSlice(RewritePolicy.DO_NOTHING) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt index 1a39d1108d2..197cf34e77b 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt @@ -50,6 +50,10 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by lazy { put(ErrorsJs.JS_NAME_PROHIBITED_FOR_NAMED_NATIVE, "@JsName is prohibited for @native declaration with explicit name") put(ErrorsJs.JS_MODULE_PROHIBITED_ON_VAR, "@JsModule annotation prohibited for 'var' declarations. Use 'val' instead.") put(ErrorsJs.JS_MODULE_PROHIBITED_ON_NON_NATIVE, "@JsModule annotation prohibited for non-@native declarations.") + put(ErrorsJs.CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM, "Can't access declaration marked with @JsModule annotation " + + "from non-modular project") + put(ErrorsJs.CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM, "Can't access declaration marked with @JsNonModule annotation " + + "from modular project") put(ErrorsJs.CANNOT_CHECK_FOR_NATIVE_INTERFACE, "Cannot check for native interface: {0}", RENDER_TYPE) put(ErrorsJs.UNCHECKED_CAST_TO_NATIVE_INTERFACE, "Unchecked cast to native interface: {0} to {1}", RENDER_TYPE, RENDER_TYPE) put(ErrorsJs.NATIVE_INTERFACE_AS_REIFIED_TYPE_ARGUMENT, "Cannot pass native interface {0} for reified type parameter", RENDER_TYPE) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java index a9a4cf73973..9bb8e9e3d76 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java @@ -54,6 +54,8 @@ public interface ErrorsJs { DiagnosticFactory0 JS_NAME_PROHIBITED_FOR_NAMED_NATIVE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 JS_MODULE_PROHIBITED_ON_VAR = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); DiagnosticFactory0 JS_MODULE_PROHIBITED_ON_NON_NATIVE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); + DiagnosticFactory0 CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM = DiagnosticFactory0.create(ERROR, DEFAULT); + DiagnosticFactory0 CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM = DiagnosticFactory0.create(ERROR, DEFAULT); DiagnosticFactory1 CANNOT_CHECK_FOR_NATIVE_INTERFACE = DiagnosticFactory1.create(ERROR); DiagnosticFactory2 UNCHECKED_CAST_TO_NATIVE_INTERFACE = DiagnosticFactory2.create(WARNING); DiagnosticFactory1 NATIVE_INTERFACE_AS_REIFIED_TYPE_ARGUMENT = DiagnosticFactory1.create(ERROR); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsModuleCallChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsModuleCallChecker.kt new file mode 100644 index 00000000000..db4c2503ce6 --- /dev/null +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsModuleCallChecker.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.js.resolve.diagnostics + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.js.resolve.MODULE_KIND +import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker +import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.scopes.receivers.ClassValueReceiver +import org.jetbrains.kotlin.serialization.js.ModuleKind + +object JsModuleCallChecker : CallChecker { + override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { + val bindingContext = context.trace.bindingContext + val containingDescriptor = context.scope.ownerDescriptor + val module = DescriptorUtils.getContainingModule(containingDescriptor) + val moduleKind = bindingContext[MODULE_KIND, module] ?: return + + val callee = findRoot(extractModuleCallee(resolvedCall) ?: return) + if (!AnnotationsUtils.isNativeObject(callee)) return + + val callToModule = AnnotationsUtils.getModuleName(callee) != null || + AnnotationsUtils.getFileModuleName(bindingContext, callee) != null + val callToNonModule = AnnotationsUtils.isNonModule(callee) || AnnotationsUtils.isFromNonModuleFile(bindingContext, callee) + + if (moduleKind == ModuleKind.PLAIN || moduleKind == ModuleKind.UMD) { + if (!callToNonModule && callToModule) { + context.trace.report(ErrorsJs.CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM.on(reportOn)) + } + } + if (moduleKind != ModuleKind.PLAIN) { + if (!callToModule && callToNonModule) { + context.trace.report(ErrorsJs.CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM.on(reportOn)) + } + } + } + + private fun extractModuleCallee(call: ResolvedCall<*>): DeclarationDescriptor? { + val callee = call.resultingDescriptor + if (DescriptorUtils.isTopLevelDeclaration(callee)) return callee + + val receiver = call.dispatchReceiver ?: return callee + if (receiver is ClassValueReceiver) return receiver.classQualifier.descriptor + + return null + } + + private fun findRoot(callee: DeclarationDescriptor) = + generateSequence(callee) { it.containingDeclaration } + .takeWhile { it !is PackageFragmentDescriptor } + .last() +} diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java index 1b16e8700db..0a96c092e4f 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java @@ -41,6 +41,7 @@ import java.util.List; public final class AnnotationsUtils { private static final String JS_NAME = "kotlin.js.JsName"; private static final FqName JS_MODULE_ANNOTATION = new FqName("kotlin.js.JsModule"); + private static final FqName JS_NON_MODULE_ANNOTATION = new FqName("kotlin.js.JsNonModule"); private AnnotationsUtils() { } @@ -203,6 +204,24 @@ public final class AnnotationsUtils { return null; } + public static boolean isNonModule(@NotNull DeclarationDescriptor declaration) { + return declaration.getAnnotations().findAnnotation(JS_NON_MODULE_ANNOTATION) != null; + } + + public static boolean isFromNonModuleFile(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) { + for (AnnotationDescriptor annotation : getContainingFileAnnotations(bindingContext, declaration)) { + DeclarationDescriptor annotationType = annotation.getType().getConstructor().getDeclarationDescriptor(); + if (annotationType == null) continue; + + FqNameUnsafe fqName = DescriptorUtils.getFqName(annotation.getType().getConstructor().getDeclarationDescriptor()); + if (fqName.equals(JS_NON_MODULE_ANNOTATION.toUnsafe())) { + return true; + } + } + + return false; + } + @NotNull private static String extractJsModuleName(@NotNull AnnotationDescriptor annotation) { ConstantValue importValue = annotation.getAllValueArguments().values().iterator().next(); @@ -225,7 +244,9 @@ public final class AnnotationsUtils { List annotations = new ArrayList(); for (KtAnnotationEntry psiAnnotation : kotlinFile.getAnnotationEntries()) { AnnotationDescriptor annotation = bindingContext.get(BindingContext.ANNOTATION, psiAnnotation); - annotations.add(annotation); + if (annotation != null) { + annotations.add(annotation); + } } return annotations; } diff --git a/js/js.libraries/src/core/annotations.kt b/js/js.libraries/src/core/annotations.kt index ac879b1c767..e75476fccc6 100644 --- a/js/js.libraries/src/core/annotations.kt +++ b/js/js.libraries/src/core/annotations.kt @@ -52,4 +52,8 @@ annotation class JsName(val name: String) @Retention(AnnotationRetention.BINARY) @Target(CLASS, PROPERTY, FUNCTION, FILE) -annotation class JsModule(val import: String) \ No newline at end of file +annotation class JsModule(val import: String) + +@Retention(AnnotationRetention.BINARY) +@Target(CLASS, PROPERTY, FUNCTION, FILE) +annotation class JsNonModule \ No newline at end of file diff --git a/js/js.serializer/src/js.proto b/js/js.serializer/src/js.proto index f593e3ff49e..920bc7c9365 100644 --- a/js/js.serializer/src/js.proto +++ b/js/js.serializer/src/js.proto @@ -26,6 +26,10 @@ message File { repeated Annotation annotation = 2; } +message Files { + repeated File file = 1; +} + extend Class { repeated Annotation class_annotation = 130; optional int32 class_containing_file_id = 135; diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java index b6b0c89339d..3cf213e86a0 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java @@ -602,6 +602,499 @@ public final class JsProtoBuf { // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.serialization.js.File) } + public interface FilesOrBuilder extends + // @@protoc_insertion_point(interface_extends:org.jetbrains.kotlin.serialization.js.Files) + org.jetbrains.kotlin.protobuf.MessageLiteOrBuilder { + + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + java.util.List + getFileList(); + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + org.jetbrains.kotlin.serialization.js.JsProtoBuf.File getFile(int index); + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + int getFileCount(); + } + /** + * Protobuf type {@code org.jetbrains.kotlin.serialization.js.Files} + */ + public static final class Files extends + org.jetbrains.kotlin.protobuf.GeneratedMessageLite implements + // @@protoc_insertion_point(message_implements:org.jetbrains.kotlin.serialization.js.Files) + FilesOrBuilder { + // Use Files.newBuilder() to construct. + private Files(org.jetbrains.kotlin.protobuf.GeneratedMessageLite.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Files(boolean noInit) { this.unknownFields = org.jetbrains.kotlin.protobuf.ByteString.EMPTY;} + + private static final Files defaultInstance; + public static Files getDefaultInstance() { + return defaultInstance; + } + + public Files getDefaultInstanceForType() { + return defaultInstance; + } + + private final org.jetbrains.kotlin.protobuf.ByteString unknownFields; + private Files( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + org.jetbrains.kotlin.protobuf.ByteString.Output unknownFieldsOutput = + org.jetbrains.kotlin.protobuf.ByteString.newOutput(); + org.jetbrains.kotlin.protobuf.CodedOutputStream unknownFieldsCodedOutput = + org.jetbrains.kotlin.protobuf.CodedOutputStream.newInstance( + unknownFieldsOutput); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFieldsCodedOutput, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + file_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + file_.add(input.readMessage(org.jetbrains.kotlin.serialization.js.JsProtoBuf.File.PARSER, extensionRegistry)); + break; + } + } + } + } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + file_ = java.util.Collections.unmodifiableList(file_); + } + try { + unknownFieldsCodedOutput.flush(); + } catch (java.io.IOException e) { + // Should not happen + } finally { + unknownFields = unknownFieldsOutput.toByteString(); + } + makeExtensionsImmutable(); + } + } + public static org.jetbrains.kotlin.protobuf.Parser PARSER = + new org.jetbrains.kotlin.protobuf.AbstractParser() { + public Files parsePartialFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return new Files(input, extensionRegistry); + } + }; + + @java.lang.Override + public org.jetbrains.kotlin.protobuf.Parser getParserForType() { + return PARSER; + } + + public static final int FILE_FIELD_NUMBER = 1; + private java.util.List file_; + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List getFileList() { + return file_; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List + getFileOrBuilderList() { + return file_; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public int getFileCount() { + return file_.size(); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.JsProtoBuf.File getFile(int index) { + return file_.get(index); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.JsProtoBuf.FileOrBuilder getFileOrBuilder( + int index) { + return file_.get(index); + } + + private void initFields() { + file_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getFileCount(); i++) { + if (!getFile(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(org.jetbrains.kotlin.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < file_.size(); i++) { + output.writeMessage(1, file_.get(i)); + } + output.writeRawBytes(unknownFields); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < file_.size(); i++) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeMessageSize(1, file_.get(i)); + } + size += unknownFields.size(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.ByteString data) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.ByteString data, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom(byte[] data) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom( + byte[] data, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom( + java.io.InputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseDelimitedFrom( + java.io.InputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parseFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + /** + * Protobuf type {@code org.jetbrains.kotlin.serialization.js.Files} + */ + public static final class Builder extends + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.Builder< + org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files, Builder> + implements + // @@protoc_insertion_point(builder_implements:org.jetbrains.kotlin.serialization.js.Files) + org.jetbrains.kotlin.serialization.js.JsProtoBuf.FilesOrBuilder { + // Construct using org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + file_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files getDefaultInstanceForType() { + return org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files.getDefaultInstance(); + } + + public org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files build() { + org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files buildPartial() { + org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files result = new org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files(this); + int from_bitField0_ = bitField0_; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + file_ = java.util.Collections.unmodifiableList(file_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.file_ = file_; + return result; + } + + public Builder mergeFrom(org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files other) { + if (other == org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files.getDefaultInstance()) return this; + if (!other.file_.isEmpty()) { + if (file_.isEmpty()) { + file_ = other.file_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureFileIsMutable(); + file_.addAll(other.file_); + } + + } + setUnknownFields( + getUnknownFields().concat(other.unknownFields)); + return this; + } + + public final boolean isInitialized() { + for (int i = 0; i < getFileCount(); i++) { + if (!getFile(i).isInitialized()) { + + return false; + } + } + return true; + } + + public Builder mergeFrom( + org.jetbrains.kotlin.protobuf.CodedInputStream input, + org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.jetbrains.kotlin.serialization.js.JsProtoBuf.Files) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List file_ = + java.util.Collections.emptyList(); + private void ensureFileIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + file_ = new java.util.ArrayList(file_); + bitField0_ |= 0x00000001; + } + } + + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public java.util.List getFileList() { + return java.util.Collections.unmodifiableList(file_); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public int getFileCount() { + return file_.size(); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public org.jetbrains.kotlin.serialization.js.JsProtoBuf.File getFile(int index) { + return file_.get(index); + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder setFile( + int index, org.jetbrains.kotlin.serialization.js.JsProtoBuf.File value) { + if (value == null) { + throw new NullPointerException(); + } + ensureFileIsMutable(); + file_.set(index, value); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder setFile( + int index, org.jetbrains.kotlin.serialization.js.JsProtoBuf.File.Builder builderForValue) { + ensureFileIsMutable(); + file_.set(index, builderForValue.build()); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile(org.jetbrains.kotlin.serialization.js.JsProtoBuf.File value) { + if (value == null) { + throw new NullPointerException(); + } + ensureFileIsMutable(); + file_.add(value); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile( + int index, org.jetbrains.kotlin.serialization.js.JsProtoBuf.File value) { + if (value == null) { + throw new NullPointerException(); + } + ensureFileIsMutable(); + file_.add(index, value); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile( + org.jetbrains.kotlin.serialization.js.JsProtoBuf.File.Builder builderForValue) { + ensureFileIsMutable(); + file_.add(builderForValue.build()); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addFile( + int index, org.jetbrains.kotlin.serialization.js.JsProtoBuf.File.Builder builderForValue) { + ensureFileIsMutable(); + file_.add(index, builderForValue.build()); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder addAllFile( + java.lang.Iterable values) { + ensureFileIsMutable(); + org.jetbrains.kotlin.protobuf.AbstractMessageLite.Builder.addAll( + values, file_); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder clearFile() { + file_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + + return this; + } + /** + * repeated .org.jetbrains.kotlin.serialization.js.File file = 1; + */ + public Builder removeFile(int index) { + ensureFileIsMutable(); + file_.remove(index); + + return this; + } + + // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.Files) + } + + static { + defaultInstance = new Files(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.serialization.js.Files) + } + public interface ClassesOrBuilder extends // @@protoc_insertion_point(interface_extends:org.jetbrains.kotlin.serialization.js.Classes) org.jetbrains.kotlin.protobuf.MessageLiteOrBuilder { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt index 277cc859238..c1c5cfe09b5 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt @@ -49,10 +49,8 @@ class KotlinJavascriptPackageFragment( private val fileMap: Map by lazy { loadResource(KotlinJavascriptSerializedResourcePaths.getFileListFilePath(fqName))?.use { rawInput -> val input = CodedInputStream.newInstance(rawInput) - val count = input.readInt32() - val result = mutableListOf() - (1..count).forEach { result += JsProtoBuf.File.parseFrom(input) } - result.map { it.id to FileHolder(it.annotationList) }.toMap() + val filesProto = JsProtoBuf.Files.parseFrom(input).fileOrBuilderList + filesProto.map { it.id to FileHolder(it.annotationList) }.toMap() }.orEmpty() } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt index f39b6b7618e..770bcdf9a64 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.serialization.js import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.protobuf.ByteString -import org.jetbrains.kotlin.protobuf.CodedOutputStream import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.classId