NamingScope.java 2.8 KB
Newer Older
P
Pavel Talanov 已提交
1
/*
A
Andrey Breslav 已提交
2
 * Copyright 2010-2012 JetBrains s.r.o.
P
Pavel Talanov 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * 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.k2js.translate.context;

import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsScope;
import org.jetbrains.annotations.NotNull;
S
Stepan Koltsov 已提交
22
import org.jetbrains.jet.lang.resolve.NameUtils;
P
pTalanov 已提交
23
import org.jetbrains.k2js.translate.utils.JsAstUtils;
P
pTalanov 已提交
24

P
Pavel Talanov 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
/**
 * @author Pavel Talanov
 *         <p/>
 *         Basically a wrapper around JsScope.
 */
public final class NamingScope {

    @NotNull
    public static NamingScope rootScope(@NotNull JsScope rootScope) {
        return new NamingScope(rootScope);
    }

    @NotNull
    private final JsScope scope;

    private NamingScope(@NotNull JsScope correspondingScope) {
        this.scope = correspondingScope;
    }

    @NotNull
    public NamingScope innerScope(@NotNull String scopeName) {
        JsScope innerJsScope = new JsScope(jsScope(), scopeName);
P
pTalanov 已提交
47
        return innerScope(innerJsScope);
P
Pavel Talanov 已提交
48 49
    }

P
pTalanov 已提交
50
    @SuppressWarnings("MethodMayBeStatic")
P
Pavel Talanov 已提交
51 52 53 54 55 56 57
    @NotNull
    public NamingScope innerScope(@NotNull JsScope correspondingScope) {
        return new NamingScope(correspondingScope);
    }

    @NotNull
        /*package*/ JsName declareUnobfuscatableName(@NotNull String name) {
S
Stepan Koltsov 已提交
58
        NameUtils.requireIdentifier(name);
P
Pavel Talanov 已提交
59 60 61 62 63 64 65
        JsName declaredName = scope.declareName(name);
        declaredName.setObfuscatable(false);
        return declaredName;
    }

    @NotNull
        /*package*/ JsName declareObfuscatableName(@NotNull String name) {
66
        return scope.declareName(obfuscateName(name));
P
Pavel Talanov 已提交
67 68 69 70
    }

    //TODO: temporary solution
    @NotNull
71
    private String obfuscateName(@NotNull String name) {
P
Pavel Talanov 已提交
72 73 74
        int obfuscate = 0;
        String result = name;
        while (true) {
75 76
            JsName existingNameWithSameIdent = this.scope.findExistingName(result);
            boolean isDuplicate = (existingNameWithSameIdent != null) && JsAstUtils.ownsName(this.scope, existingNameWithSameIdent);
P
Pavel Talanov 已提交
77 78 79 80 81 82 83 84 85

            if (!isDuplicate) break;

            result = name + "$" + obfuscate;
            obfuscate++;
        }
        return result;
    }

P
pTalanov 已提交
86 87

    @NotNull
P
Pavel Talanov 已提交
88 89 90 91 92 93 94 95 96
    public JsName declareTemporary() {
        return scope.declareTemporary();
    }

    @NotNull
    public JsScope jsScope() {
        return scope;
    }
}