/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.flex.compiler.definitions; import org.apache.flex.compiler.definitions.references.INamespaceReference; import org.apache.flex.compiler.tree.as.INamespaceNode; /** * A definition representing a <code>namespace</code> declaration. * <p> * An <code>INamespaceDefinition</code is created from an <code>INamespaceNode</code>. * <p> * For example, the declaration * <pre>public namespace ns = "http://whatever";</pre> * creates a namespace definition whose base name is <code>"ns"</code>, * whose namespace reference is to the <code>public</code> namespace, * and whose type reference is <code>null</code>. * <p> * A user-defined namespace definition is contained within a file scope, * a package scope, a class scope, an interface scope, or a function scope; * it does not contain a scope. * <p> * There are also builtin namespace definitions for <code>public</code>, * <code>protected</code>, <code>private</code>, and <code>internal</code> * namespaces. * <p> * <code>NamespaceDefinition.getPublicNamespaceDefinition()</code> * is the singleton <code>IPublicNamespaceDefinition</code> representing * the <code>public</code> namespace. * All files share the same public namespace. * <p> * <code>NamespaceDefinition.createPrivateNamespaceDefinition()</code> * returns an <code>IPrivateNamespaceDefinition</code> representing * the <code>private</code> namespace for a particular file. * Different files have different private namespaces. * <p> * <code>NamespaceDefinition.createProtectedNamespaceDefinition()</code> * returns an <code>IProtectedNamespaceDefinition</code> representing * the <code>protected</code> namespace for a particular file. * Different fiels have different protected namespaces. * <p> * <code>NamespaceDefinition.createInternalNamespaceDefinition</code> * returns an <code>IInternalNamespaceDefinition</code> representing * the <code>internal</code> naemspace for a particular package. * Different packages have different internal namespaces. */ public interface INamespaceDefinition extends IDocumentableDefinition, IQualifiers { /** * Determines the type of namespace */ static enum NamespaceClassification { /** * Local namespace contained with a non-visible scope */ LOCAL, /** * A namespace that is a member of a package */ PACKAGE_MEMBER, /** * A namespace that is a member of a class */ CLASS_MEMBER, /** * A namespace that is a member of a file */ FILE_MEMBER, /** * A namespace that is part of the ActionScript language: public, * private, protected, internal */ LANGUAGE } /** * Get the classification for this namespace (local, package level, etc, * etc) * * @return a {@link NamespaceClassification} */ NamespaceClassification getNamespaceClassification(); /** * Returns the optional URI associated with this namespace * * @return the URI or an empty string */ String getURI(); /** * Returns the {@link INamespaceNode} from which this definition was * created, if the definition came from the AST for a source file. * <p> * This method may require the AST to be reloaded or regenerated and * therefore may be slow. */ @Override INamespaceNode getNode(); /** * @param namespace * @return true if namespace and this resolve to the same URI This method is * a much better way of comparing namespaces than comparing them by name * (which should never be done). */ boolean equals(INamespaceDefinition namespace); boolean isPublicOrInternalNamespace(); /** * Interface implemented by all language namespace definitions. */ interface ILanguageNamespaceDefinition extends INamespaceReference, INamespaceDefinition { } /** * Interface implemented by all language namespace definitions associated * with a package. */ interface INamespaceWithPackageName extends ILanguageNamespaceDefinition { /** * Retrieves the string that should be used as the prefix for URI's in * generated protected and static protected namespace definitions in * classes. * * @return The prefix for URI's of generated namespace definition's. */ String getGeneratedURIPrefix(); /** * Retrieves the package name associated with this namespace. * * @return the package name associated with this namespace. */ String getNamespacePackageName(); } /** * Interface implemented by all public namespace definitions. */ interface IPublicNamespaceDefinition extends INamespaceWithPackageName { } /** * Interface implemented by all internal namespace definitions. */ interface IInternalNamespaceDefinition extends INamespaceWithPackageName { } /** * Interface implemented by the code model implicit definition namespace * definition. */ interface ICodeModelImplicitDefinitionNamespaceDefinition extends ILanguageNamespaceDefinition { } /** * Interface implemented by all protected namespace definitions. */ interface IProtectedNamespaceDefinition extends ILanguageNamespaceDefinition { } /** * Interface implemented by all static protected namespace definitions. */ interface IStaticProtectedNamespaceDefinition extends ILanguageNamespaceDefinition { } /** * Interface implemented by all private namespace definitions. */ interface IPrivateNamespaceDefinition extends ILanguageNamespaceDefinition { } /** * Interface implemented by the any namespace definition. */ interface IAnyNamespaceDefinition extends ILanguageNamespaceDefinition { } /** * Interface implemented by all file private namespace definitions. The * distinction between file private namespaces and regular private * namespaces is purely for the benefit of code model clients. */ interface IFilePrivateNamespaceDefinition extends IPrivateNamespaceDefinition, INamespaceWithPackageName { } /** * Interface implemented by all interface namespace definitions. */ interface IInterfaceNamespaceDefinition extends ILanguageNamespaceDefinition { } }