blob: a3b44eda623f4c18553011460ee2fb5fdbcfe386 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 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.internal.core;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.dltk.annotations.NonNull;
import org.eclipse.dltk.compiler.problem.IProblemCategory;
import org.eclipse.dltk.compiler.problem.IProblemIdentifier;
import org.eclipse.dltk.javascript.typeinfo.IRConstructor;
import org.eclipse.dltk.javascript.typeinfo.IRMember;
import org.eclipse.dltk.javascript.typeinfo.IRMethod;
import org.eclipse.dltk.javascript.typeinfo.IRProperty;
import org.eclipse.dltk.javascript.typeinfo.IRType;
import org.eclipse.dltk.javascript.typeinfo.IRTypeDeclaration;
import org.eclipse.dltk.javascript.typeinfo.ITypeSystem;
import org.eclipse.dltk.javascript.typeinfo.TypeCompatibility;
import org.eclipse.dltk.javascript.typeinfo.model.GenericType;
import org.eclipse.dltk.javascript.typeinfo.model.Type;
import org.eclipse.dltk.javascript.typeinfo.model.TypeKind;
public class RTypeDeclaration implements IRTypeDeclaration {
@NonNull
protected final ITypeSystem typeSystem;
@NonNull
protected final Type type;
private RTypeDeclaration superType;
private List<RTypeDeclaration> traits;
private List<IRMember> members;
private List<IRConstructor> constructors;
private IRConstructor staticConstructor;
public RTypeDeclaration(ITypeSystem typeSystem, Type type) {
this.typeSystem = typeSystem;
this.type = type;
}
protected ITypeSystem getEffectiveTypeSystem() {
return typeSystem;
}
public String getName() {
return type.getName();
}
public Set<IProblemCategory> getSuppressedWarnings() {
return Collections.emptySet();
}
public boolean isSuppressed(IProblemIdentifier problemIdentifier) {
return false;
}
public boolean isDeprecated() {
return type.isDeprecated();
}
public ITypeSystem getTypeSystem() {
return typeSystem;
}
public Type getSource() {
return type;
}
public IRTypeDeclaration getSuperType() {
return superType;
}
@SuppressWarnings("unchecked")
public List<IRTypeDeclaration> getTraits() {
return (List<IRTypeDeclaration>) (List<?>) traits;
}
public List<IRMember> getMembers() {
return members;
}
@Override
public int hashCode() {
return type.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final RTypeDeclaration other = (RTypeDeclaration) obj;
return type.equals(other.type);
}
@Override
public String toString() {
return getName();
}
public void setMembers(List<IRMember> members) {
this.members = members;
}
public void setSuperType(RTypeDeclaration superType) {
this.superType = superType;
}
public void setTraits(List<RTypeDeclaration> traits) {
this.traits = traits;
}
public TypeKind getKind() {
return type.getKind();
}
public boolean isInheritStaticMembers() {
return type.isInheritStaticMembers();
}
public Object getReadOnlyStatus(IRProperty property) {
return type.getReadOnlyStatus(property.getSource());
}
public boolean isGeneric() {
return type instanceof GenericType;
}
public boolean isParameterized() {
return false;
}
public List<IRType> getActualTypeArguments() {
return Collections.emptyList();
}
public List<IRConstructor> getConstructors() {
return constructors;
}
public void setConstructors(List<IRConstructor> constructors) {
this.constructors = constructors;
}
public IRConstructor getStaticConstructor() {
return staticConstructor;
}
public void setStaticConstructor(IRConstructor staticConstructor) {
this.staticConstructor = staticConstructor;
}
public TypeCompatibility isAssignableFrom(IRTypeDeclaration declaration) {
final TypeCompatibility result = isAssignableFrom(this,
(RTypeDeclaration) declaration, new HashSet<RTypeDeclaration>());
return result != null ? result : TypeCompatibility.FALSE;
}
/*
* overridden in RParameterizedTypeDeclaration
*/
protected boolean _equals(RTypeDeclaration other) {
return this.equals(other)
|| type.equals(other.type)
|| ((type.getKind() == TypeKind.UNKNOWN || other.type.getKind() == TypeKind.UNKNOWN) && type
.getName().equals(other.type.getName()));
}
private static TypeCompatibility isAssignableFrom(RTypeDeclaration self,
RTypeDeclaration current, Set<RTypeDeclaration> visited) {
if (visited.add(current)) {
if (self._equals(current)) {
return TypeCompatibility.TRUE;
}
final RTypeDeclaration superType = current.superType;
if (superType != null) {
final TypeCompatibility result = isAssignableFrom(self,
superType, visited);
if (result != null) {
return result;
}
}
for (RTypeDeclaration trait : current.traits) {
final TypeCompatibility result = isAssignableFrom(self, trait,
visited);
if (result != null) {
return result;
}
}
}
return null;
}
public IRMethod findMethod(String name, boolean isStatic) {
for (IRMember member : members) {
if (member instanceof IRMethod && name.equals(member.getName())
&& isStatic == member.isStatic()) {
return (IRMethod) member;
}
}
return null;
}
}