package org.jetbrains.plugins.ruby.motion.symbols;
import com.intellij.openapi.module.Module;
import com.intellij.psi.PsiElement;
import com.jetbrains.cidr.CocoaDocumentationManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.ruby.motion.bridgesupport.Struct;
import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.Type;
import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.structure.Children;
import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.structure.ChildrenImpl;
import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.structure.Symbol;
import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.structure.SymbolImpl;
import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.v2.SymbolPsiProcessor;
/**
* @author Dennis.Ushakov
*/
public class StructSymbol extends SymbolImpl implements MotionSymbol {
@NotNull private final Module myModule;
@NotNull private final Struct myStruct;
public StructSymbol(@NotNull Module module,
@NotNull Struct struct) {
super(module.getProject(), struct.getName(), Type.CLASS, null);
myModule = module;
myStruct = struct;
}
@NotNull
@Override
public Children getChildren() {
return new ChildrenImpl() {
@Override
public boolean processChildren(SymbolPsiProcessor processor, final PsiElement invocationPoint) {
for (String name : myStruct.getFields()) {
final Symbol[] symbols = MotionSymbolUtil.createStructFieldSymbols(myModule, StructSymbol.this, myStruct, name);
for (Symbol symbol : symbols) {
if (!processor.process(symbol)) {
return false;
}
}
}
return true;
}
};
}
@Override
public CocoaDocumentationManager.DocTokenType getInfoType() {
return CocoaDocumentationManager.DocTokenType.TYPEDEF;
}
@Override
public String getInfoName() {
final String name = getName();
assert name != null;
return name;
}
@NotNull
@Override
public Module getModule() {
return myModule;
}
}