JS: remove unused imports from generated JS. Fix KT-14748
This commit is contained in:
+2
@@ -105,6 +105,8 @@ var JsNameRef.coroutineController by MetadataProperty(default = false)
|
|||||||
|
|
||||||
var JsFunction.continuationInterfaceRef: JsExpression? by MetadataProperty(default = null)
|
var JsFunction.continuationInterfaceRef: JsExpression? by MetadataProperty(default = null)
|
||||||
|
|
||||||
|
var JsName.imported by MetadataProperty(default = false)
|
||||||
|
|
||||||
enum class TypeCheck {
|
enum class TypeCheck {
|
||||||
TYPEOF,
|
TYPEOF,
|
||||||
INSTANCEOF,
|
INSTANCEOF,
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* 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.inline.clean
|
||||||
|
|
||||||
|
import com.google.dart.compiler.backend.js.ast.*
|
||||||
|
import com.google.dart.compiler.backend.js.ast.metadata.imported
|
||||||
|
|
||||||
|
fun removeUnusedImports(root: JsNode) {
|
||||||
|
val collector = UsedImportsCollector()
|
||||||
|
root.accept(collector)
|
||||||
|
NodeRemover(JsVars::class.java) { statement ->
|
||||||
|
if (statement.vars.size == 1) {
|
||||||
|
val name = statement.vars[0].name
|
||||||
|
name.imported && name !in collector.usedImports
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}.accept(root)
|
||||||
|
}
|
||||||
|
|
||||||
|
private class UsedImportsCollector : RecursiveJsVisitor() {
|
||||||
|
val usedImports = mutableSetOf<JsName>()
|
||||||
|
|
||||||
|
override fun visitNameRef(nameRef: JsNameRef) {
|
||||||
|
val name = nameRef.name
|
||||||
|
if (name != null && name.imported) {
|
||||||
|
usedImports += name
|
||||||
|
}
|
||||||
|
super.visitNameRef(nameRef)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4562,6 +4562,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/inlineSizeReduction"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/inlineSizeReduction"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineImportCleanup.kt")
|
||||||
|
public void testInlineImportCleanup() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineSizeReduction/inlineImportCleanup.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineLambdaCleanup.kt")
|
@TestMetadata("inlineLambdaCleanup.kt")
|
||||||
public void testInlineLambdaCleanup() throws Exception {
|
public void testInlineLambdaCleanup() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineSizeReduction/inlineLambdaCleanup.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineSizeReduction/inlineLambdaCleanup.kt");
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.config.JsConfig;
|
|||||||
import org.jetbrains.kotlin.js.coroutine.CoroutineTransformer;
|
import org.jetbrains.kotlin.js.coroutine.CoroutineTransformer;
|
||||||
import org.jetbrains.kotlin.js.facade.exceptions.TranslationException;
|
import org.jetbrains.kotlin.js.facade.exceptions.TranslationException;
|
||||||
import org.jetbrains.kotlin.js.inline.JsInliner;
|
import org.jetbrains.kotlin.js.inline.JsInliner;
|
||||||
|
import org.jetbrains.kotlin.js.inline.clean.RemoveUnusedImportsKt;
|
||||||
import org.jetbrains.kotlin.js.translate.context.TranslationContext;
|
import org.jetbrains.kotlin.js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.kotlin.js.translate.general.Translation;
|
import org.jetbrains.kotlin.js.translate.general.Translation;
|
||||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
|
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
|
||||||
@@ -88,6 +89,7 @@ public final class K2JSTranslator {
|
|||||||
|
|
||||||
CoroutineTransformer coroutineTransformer = new CoroutineTransformer(program);
|
CoroutineTransformer coroutineTransformer = new CoroutineTransformer(program);
|
||||||
coroutineTransformer.accept(program);
|
coroutineTransformer.accept(program);
|
||||||
|
RemoveUnusedImportsKt.removeUnusedImports(program);
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled();
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled();
|
||||||
if (hasError(diagnostics)) return new TranslationResult.Fail(diagnostics);
|
if (hasError(diagnostics)) return new TranslationResult.Fail(diagnostics);
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.js.config.LibrarySourcesConfig.UNKNOWN_EXTERNAL_MODULE_NAME;
|
import static org.jetbrains.kotlin.js.config.LibrarySourcesConfig.UNKNOWN_EXTERNAL_MODULE_NAME;
|
||||||
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.getNameForAnnotatedObject;
|
|
||||||
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isLibraryObject;
|
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isLibraryObject;
|
||||||
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject;
|
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject;
|
||||||
import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn;
|
import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn;
|
||||||
@@ -403,6 +402,7 @@ public final class StaticContext {
|
|||||||
// TODO: remove prefix when problem with scopes is solved
|
// TODO: remove prefix when problem with scopes is solved
|
||||||
|
|
||||||
JsName result = rootFunction.getScope().declareFreshName("imported$" + suggestedName);
|
JsName result = rootFunction.getScope().declareFreshName("imported$" + suggestedName);
|
||||||
|
MetadataProperties.setImported(result, true);
|
||||||
importStatements.add(JsAstUtils.newVar(result, declaration));
|
importStatements.add(JsAstUtils.newVar(result, declaration));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// MODULE: lib
|
||||||
|
// FILE: lib.kt
|
||||||
|
package lib
|
||||||
|
|
||||||
|
inline fun foo(f: () -> String) = f()
|
||||||
|
|
||||||
|
// MODULE: main(lib)
|
||||||
|
// FILE: main.kt
|
||||||
|
// PROPERTY_NOT_READ_FROM: foo_6r51u9$
|
||||||
|
fun box() = lib.foo { "OK" }
|
||||||
Reference in New Issue
Block a user