package com.oracle.truffle.llvm.runtime.debug.type;
import java.util.ArrayList;
import java.util.stream.Collectors;
import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.llvm.runtime.debug.scope.LLVMSourceLocation;
import com.oracle.truffle.llvm.runtime.debug.value.LLVMDebugObject;
import com.oracle.truffle.llvm.runtime.debug.value.LLVMDebugObjectBuilder;
import com.oracle.truffle.llvm.runtime.debug.value.LLVMDebugValue;
public final class LLVMSourceStaticMemberType extends LLVMSourceType {
public static class CollectionType extends LLVMSourceType {
static final String MEMBERNAME = "<static>";
private static final String TYPENAME = "";
private final ArrayList<LLVMSourceStaticMemberType> members;
CollectionType() {
super(() -> TYPENAME, 0L, 0L, 0L, null);
this.members = new ArrayList<>();
}
@TruffleBoundary
void addMember(LLVMSourceStaticMemberType member) {
CompilerAsserts.neverPartOfCompilation();
members.add(member);
}
@TruffleBoundary
public String[] getIdentifiers() {
return members.stream().map(LLVMSourceStaticMemberType::getName).collect(Collectors.toList()).toArray(new String[members.size()]);
}
public LLVMDebugObjectBuilder getMemberValue(String name) {
final LLVMSourceStaticMemberType member = getMember(name);
return member != null ? member.getValue() : DEFAULT_VALUE;
}
@Override
@TruffleBoundary
public int getElementCount() {
return members.size();
}
@TruffleBoundary
private LLVMSourceStaticMemberType getMember(long i) {
if (0 <= i && i < members.size()) {
return members.get((int) i);
}
return null;
}
@TruffleBoundary
private LLVMSourceStaticMemberType getMember(String name) {
if (name == null) {
return null;
}
for (final LLVMSourceStaticMemberType member : members) {
if (name.equals(member.getName())) {
return member;
}
}
return null;
}
@Override
public String getElementName(long i) {
final LLVMSourceStaticMemberType member = getMember(i);
return member != null ? member.getName() : null;
}
@Override
public LLVMSourceType getElementType(long i) {
final LLVMSourceStaticMemberType member = getMember(i);
return member != null ? member.getElementType() : null;
}
@Override
public LLVMSourceType getElementType(String name) {
final LLVMSourceStaticMemberType member = getMember(name);
return member != null ? member.getElementType() : null;
}
@Override
public LLVMSourceLocation getElementDeclaration(long i) {
final LLVMSourceStaticMemberType member = getMember(i);
return member != null ? member.getLocation() : null;
}
@Override
public LLVMSourceLocation getElementDeclaration(String name) {
final LLVMSourceStaticMemberType member = getMember(name);
return member != null ? member.getLocation() : null;
}
@Override
public LLVMSourceType getOffset(long newOffset) {
return this;
}
}
private static final LLVMDebugObjectBuilder DEFAULT_VALUE = new LLVMDebugObjectBuilder() {
@Override
public LLVMDebugObject getValue(LLVMSourceType type, LLVMSourceLocation declaration) {
return LLVMDebugObject.create(type, 0L, LLVMDebugValue.UNAVAILABLE, declaration);
}
};
@CompilationFinal private LLVMSourceType elementType = null;
@CompilationFinal private LLVMDebugObjectBuilder value = DEFAULT_VALUE;
public LLVMSourceStaticMemberType(String name, long size, long align, LLVMSourceLocation location) {
super(() -> name, size, align, 0L, location);
}
public LLVMDebugObjectBuilder getValue() {
CompilerAsserts.neverPartOfCompilation();
return value;
}
public void setValue(LLVMDebugObjectBuilder value) {
CompilerAsserts.neverPartOfCompilation();
this.value = value;
}
public LLVMSourceType getElementType() {
return elementType;
}
public void setElementType(LLVMSourceType elementType) {
CompilerAsserts.neverPartOfCompilation();
this.elementType = elementType;
}
@Override
@TruffleBoundary
public String toString() {
return String.format("%s: %s", getName(), elementType != null ? elementType.getName() : null);
}
@Override
public LLVMSourceType getOffset(long newOffset) {
return this;
}
@Override
public boolean isAggregate() {
return true;
}
@Override
public int getElementCount() {
return 1;
}
@Override
public String getElementName(long i) {
if (i == 0) {
return getName();
}
return null;
}
@Override
public LLVMSourceType getElementType(long i) {
if (i == 0) {
return getElementType();
}
return null;
}
@Override
public LLVMSourceType getElementType(String name) {
if (name != null && name.equals(getName())) {
return getElementType();
}
return null;
}
}