All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.javascript.jscomp.disambiguate.PropertyClustering Maven / Gradle / Ivy

Go to download

Closure Compiler is a JavaScript optimizing compiler. It parses your JavaScript, analyzes it, removes dead code and rewrites and minimizes what's left. It also checks syntax, variable references, and types, and warns about common JavaScript pitfalls. It is used in many of Google's JavaScript apps, including Gmail, Google Web Search, Google Maps, and Google Docs.

There is a newer version: v20240317
Show newest version
/*
 * Copyright 2008 The Closure Compiler Authors.
 *
 * 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 com.google.javascript.jscomp.disambiguate;

import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;

import com.google.common.base.MoreObjects;
import com.google.errorprone.annotations.DoNotCall;
import com.google.javascript.jscomp.graph.StandardUnionFind;
import com.google.javascript.rhino.Node;
import java.util.LinkedHashMap;
import javax.annotation.Nullable;

/**
 * The disambiguation clusters for a given property name.
 *
 * 

This is a struct used to aggragate information to be processed by other passes. */ final class PropertyClustering { private final String name; @Nullable private LinkedHashMap useSites = new LinkedHashMap<>(); @Nullable private StandardUnionFind clusters = new StandardUnionFind<>(); @Nullable private FlatType externsClusterElem; PropertyClustering(String name) { this.name = checkNotNull(name); } String getName() { return this.name; } /** * The locations properties with this name were used in the program, mapping to their receiver * type. * *

This index allows property references to be efficiently renamed once all clusters have been * found. It prevents us from re-traversing the code. */ LinkedHashMap getUseSites() { return checkNotNull(this.useSites); } StandardUnionFind getClusters() { return checkNotNull(this.clusters); } /** * The current representative of the cluster of types that includes extern types. * *

The following refers to all computations with respect to a single property name. Since * extern properties cannot be renamed, all other types in a cluster with an extern type cannot * rename their property either. In theory, there could be many such clusters containing an extern * type; however, in practice we conflate them into one. This is eqivalent because all of those * clusters would end up using the same, unchanged, property name. This representation also * simplifies tracking the clusters containing extern types. */ @Nullable FlatType getExternsClusterRep() { checkState(!this.isInvalidated()); return (this.externsClusterElem == null) ? null : this.clusters.find(this.externsClusterElem); } boolean isInvalidated() { return this.clusters == null; } void invalidate() { this.clusters = null; this.externsClusterElem = null; this.useSites = null; } void registerExternType(FlatType extern) { checkState(!this.isInvalidated()); if (this.externsClusterElem == null) { this.externsClusterElem = extern; } this.clusters.union(this.externsClusterElem, extern); } @Override @DoNotCall // For debugging only. public String toString() { return MoreObjects.toStringHelper(this).add("name", this.name).toString(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy