package org.example.smalljava.typing;
import com.google.common.base.Objects;
import com.google.inject.Inject;
import java.util.ArrayList;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.xbase.lib.Extension;
import org.example.smalljava.lib.SmallJavaLib;
import org.example.smalljava.smallJava.SJClass;
import org.example.smalljava.typing.SmallJavaTypeProvider;
import org.example.smalljava.util.SmallJavaModelUtil;
@SuppressWarnings("all")
public class SmallJavaTypeConformance {
@Inject
@Extension
private IQualifiedNameProvider _iQualifiedNameProvider;
public boolean isConformant(final SJClass c1, final SJClass c2) {
boolean _or = false;
boolean _or_1 = false;
boolean _or_2 = false;
boolean _or_3 = false;
boolean _equals = Objects.equal(c1, SmallJavaTypeProvider.nullType);
if (_equals) {
_or_3 = true;
} else {
boolean _conformToLibraryTypes = this.conformToLibraryTypes(c1, c2);
_or_3 = _conformToLibraryTypes;
}
if (_or_3) {
_or_2 = true;
} else {
boolean _equals_1 = Objects.equal(c1, c2);
_or_2 = _equals_1;
}
if (_or_2) {
_or_1 = true;
} else {
QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(c2);
String _string = _fullyQualifiedName.toString();
boolean _equals_2 = Objects.equal(_string, SmallJavaLib.LIB_OBJECT);
_or_1 = _equals_2;
}
if (_or_1) {
_or = true;
} else {
boolean _isSubclassOf = this.isSubclassOf(c1, c2);
_or = _isSubclassOf;
}
return _or;
}
public boolean conformToLibraryTypes(final SJClass c1, final SJClass c2) {
boolean _or = false;
boolean _or_1 = false;
boolean _and = false;
boolean _conformsToString = this.conformsToString(c1);
if (!_conformsToString) {
_and = false;
} else {
boolean _conformsToString_1 = this.conformsToString(c2);
_and = _conformsToString_1;
}
if (_and) {
_or_1 = true;
} else {
boolean _and_1 = false;
boolean _conformsToInt = this.conformsToInt(c1);
if (!_conformsToInt) {
_and_1 = false;
} else {
boolean _conformsToInt_1 = this.conformsToInt(c2);
_and_1 = _conformsToInt_1;
}
_or_1 = _and_1;
}
if (_or_1) {
_or = true;
} else {
boolean _and_2 = false;
boolean _conformsToBoolean = this.conformsToBoolean(c1);
if (!_conformsToBoolean) {
_and_2 = false;
} else {
boolean _conformsToBoolean_1 = this.conformsToBoolean(c2);
_and_2 = _conformsToBoolean_1;
}
_or = _and_2;
}
return _or;
}
public boolean conformsToString(final SJClass c) {
boolean _or = false;
boolean _equals = Objects.equal(c, SmallJavaTypeProvider.stringType);
if (_equals) {
_or = true;
} else {
QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(c);
String _string = _fullyQualifiedName.toString();
boolean _equals_1 = Objects.equal(_string, SmallJavaLib.LIB_STRING);
_or = _equals_1;
}
return _or;
}
public boolean conformsToInt(final SJClass c) {
boolean _or = false;
boolean _equals = Objects.equal(c, SmallJavaTypeProvider.intType);
if (_equals) {
_or = true;
} else {
QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(c);
String _string = _fullyQualifiedName.toString();
boolean _equals_1 = Objects.equal(_string, SmallJavaLib.LIB_INTEGER);
_or = _equals_1;
}
return _or;
}
public boolean conformsToBoolean(final SJClass c) {
boolean _or = false;
boolean _equals = Objects.equal(c, SmallJavaTypeProvider.booleanType);
if (_equals) {
_or = true;
} else {
QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(c);
String _string = _fullyQualifiedName.toString();
boolean _equals_1 = Objects.equal(_string, SmallJavaLib.LIB_BOOLEAN);
_or = _equals_1;
}
return _or;
}
public boolean isSubclassOf(final SJClass c1, final SJClass c2) {
ArrayList<SJClass> _classHierarchy = SmallJavaModelUtil.classHierarchy(c1);
return _classHierarchy.contains(c2);
}
}