JS: remove unused imports from generated JS. Fix KT-14748

This commit is contained in:
Alexey Andreev
2016-11-22 12:42:49 +03:00
parent cf89e24b49
commit ea1e196e9a
6 changed files with 67 additions and 1 deletions
@@ -105,6 +105,8 @@ var JsNameRef.coroutineController by MetadataProperty(default = false)
var JsFunction.continuationInterfaceRef: JsExpression? by MetadataProperty(default = null)
var JsName.imported by MetadataProperty(default = false)
enum class TypeCheck {
TYPEOF,
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);
}
@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")
public void testInlineLambdaCleanup() throws Exception {
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.facade.exceptions.TranslationException;
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.general.Translation;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
@@ -88,6 +89,7 @@ public final class K2JSTranslator {
CoroutineTransformer coroutineTransformer = new CoroutineTransformer(program);
coroutineTransformer.accept(program);
RemoveUnusedImportsKt.removeUnusedImports(program);
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled();
if (hasError(diagnostics)) return new TranslationResult.Fail(diagnostics);
@@ -48,7 +48,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import java.util.*;
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.isNativeObject;
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
JsName result = rootFunction.getScope().declareFreshName("imported$" + suggestedName);
MetadataProperties.setImported(result, true);
importStatements.add(JsAstUtils.newVar(result, declaration));
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" }