blob: 53cfe83f7d1351875707c6b967d9bd64cbefff2a [file] [log] [blame]
/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.dart.engine.internal.type;
import com.google.dart.engine.internal.element.DynamicElementImpl;
import com.google.dart.engine.internal.element.ElementPair;
import com.google.dart.engine.scanner.Keyword;
import com.google.dart.engine.type.Type;
import java.util.Set;
/**
* The unique instance of the class {@code DynamicTypeImpl} implements the type {@code dynamic}.
*
* @coverage dart.engine.type
*/
public class DynamicTypeImpl extends TypeImpl {
/**
* The unique instance of this class.
*/
private static final DynamicTypeImpl INSTANCE = new DynamicTypeImpl(); //$NON-NLS-1$
/**
* Return the unique instance of this class.
*
* @return the unique instance of this class
*/
public static DynamicTypeImpl getInstance() {
return INSTANCE;
}
/**
* Prevent the creation of instances of this class.
*/
private DynamicTypeImpl() {
super(new DynamicElementImpl(), Keyword.DYNAMIC.getSyntax());
((DynamicElementImpl) getElement()).setType(this);
}
@Override
public boolean equals(Object object) {
return object == this;
}
@Override
public int hashCode() {
return 1;
}
@Override
public boolean isDynamic() {
return true;
}
@Override
public boolean isSupertypeOf(Type type) {
// dynamic is a supertype of all types
return true;
}
@Override
public Type substitute(Type[] argumentTypes, Type[] parameterTypes) {
int length = parameterTypes.length;
for (int i = 0; i < length; i++) {
if (parameterTypes[i].equals(this)) {
return argumentTypes[i];
}
}
return this;
}
@Override
protected boolean internalEquals(Object object, Set<ElementPair> visitedElementPairs) {
return object == this;
}
@Override
protected boolean internalIsMoreSpecificThan(Type type, boolean withDynamic,
Set<TypePair> visitedTypePairs) {
// T is S
if (this == type) {
return true;
}
// else
return withDynamic;
}
@Override
protected boolean internalIsSubtypeOf(Type type, Set<TypePair> visitedTypePairs) {
//dynamic is a subtype of all types
return true;
}
}