| /******************************************************************************* |
| * Copyright (c) 2011 NumberFour AG |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * NumberFour AG - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.javascript.typeinfo; |
| |
| import org.eclipse.dltk.javascript.typeinfo.model.JSType; |
| import org.eclipse.dltk.javascript.typeinfo.model.Type; |
| |
| /** |
| * The root of the "resolved" type expression hierarchy, which is used when |
| * evaluating the code. The instances are created based on EMF-backed |
| * {@link JSType} type expressions (which are used only for declarations). |
| * <p> |
| * The rationale for these classes is having an easy and efficient way to |
| * compare type expressions and a standard workflow for resolving {@link Type} |
| * proxies. |
| * </p> |
| * <p> |
| * Concrete type expressions are represented by child types - |
| * {@link IRSimpleType}, {@link IRClassType} just to name a few. |
| * </p> |
| * <p> |
| * Types are represented by {@link IRTypeDeclaration} instances, parameterized |
| * types have all the type variables replaced with the actual values, the only |
| * way to distinguish them is checking |
| * {@link IRTypeDeclaration#isParameterized()} and |
| * {@link IRTypeDeclaration#getActualTypeArguments()}. |
| * </p> |
| * <p> |
| * Use {@link RTypes#create(ITypeSystem, JSType)} to create them. |
| * </p> |
| */ |
| public interface IRType { |
| |
| /** |
| * Returns the name of this type expression. |
| */ |
| String getName(); |
| |
| /** |
| * Checks if this type expression is compatible with the specified one. |
| */ |
| TypeCompatibility isAssignableFrom(IRType type); |
| |
| /** |
| * Answers if additional members could be added to this type expression. |
| */ |
| boolean isExtensible(); |
| |
| /** |
| * Answers if this type expression extends JavaScript Object type. The only |
| * possible way to have <code>false</code> here is {@link IRSimpleType} |
| * pointing to foreign (java) type in Rhino environment. |
| */ |
| boolean isJavaScriptObject(); |
| |
| /** |
| * Answers if this type is "synthetic", i.e. not specified type variable or |
| * other special markers. |
| */ |
| boolean isSynthetic(); |
| |
| /** |
| * Transforms the type using the specified function. |
| */ |
| IRType transform(IRTypeTransformer function); |
| |
| /** |
| * Normalizes this type, i.e. removes unnecessary options from the type |
| * expression. Most of the time this function returns <code>this</code>. |
| */ |
| IRType normalize(); |
| |
| } |