blob: f7a6ca3a43f8c6479be2ad5f53d9d528643c50e0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011,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.typeinfo;
class RMapType extends RType implements IRMapType {
private final IRType valueType;
private final IRType keyType;
public RMapType(IRType keyType, IRType valueType) {
this.keyType = keyType;
this.valueType = valueType;
}
public String getName() {
// if the key type is set but it is a String then just default to
// without it.
if (valueType != null && keyType != null
&& !ITypeNames.STRING.equals(keyType.getName())) {
return ITypeNames.OBJECT + '<' + keyType.getName() + ','
+ valueType.getName() + '>';
}
return valueType != null ? ITypeNames.OBJECT + '<'
+ valueType.getName() + '>' : ITypeNames.OBJECT;
}
@Override
public int hashCode() {
return valueType.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof RMapType) {
final RMapType other = (RMapType) obj;
return valueType.equals(other.valueType);
}
return false;
}
@Override
public boolean isExtensible() {
return true;
}
@Override
public TypeCompatibility isAssignableFrom(IRType type) {
if (super.isAssignableFrom(type).ok()) {
return TypeCompatibility.TRUE;
}
if (type instanceof RMapType) {
return valueType.isAssignableFrom(((RMapType) type).valueType);
} else if (type instanceof IRRecordType) {
TypeCompatibility result = TypeCompatibility.TRUE;
for (IRRecordMember member : ((IRRecordType) type).getMembers()) {
final TypeCompatibility compatibility = valueType
.isAssignableFrom(member.getType());
if (compatibility == TypeCompatibility.FALSE) {
return compatibility;
} else if (compatibility != result
&& compatibility.after(result)) {
result = compatibility;
}
}
return result;
}
return TypeCompatibility.FALSE;
}
public IRType getKeyType() {
return keyType;
}
public IRType getValueType() {
return valueType;
}
}