package name.admitriev.jhelper.generation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.jetbrains.cidr.lang.psi.OCFile;
import com.jetbrains.cidr.lang.psi.OCIncludeDirective;
import com.jetbrains.cidr.lang.psi.OCPragma;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.Set;
public class IncludesProcessor {
private Set<PsiFile> processedFiles = new HashSet<>();
@SuppressWarnings("StringBufferField")
private StringBuilder result = new StringBuilder();
private IncludesProcessor() {
}
private void processFile(PsiFile file) {
if (processedFiles.contains(file)) {
return;
}
processedFiles.add(file);
for (PsiElement element : file.getChildren()) {
if (element instanceof OCIncludeDirective) {
OCIncludeDirective include = (OCIncludeDirective) element;
if (isInternalInclude(include)) {
processFile(include.getIncludedFile());
}
else {
processAngleBracketsInclude(include);
}
continue;
}
if (element instanceof OCPragma) {
OCPragma pragma = (OCPragma) element;
if (pragma.getContent(true).first.equals("once")) {
continue;
}
}
result.append(element.getText());
}
}
private static boolean isInternalInclude(OCIncludeDirective include) {
PsiFile file = include.getIncludedFile();
return file != null && ((OCFile) file).isInProjectSources();
}
private void processAngleBracketsInclude(OCIncludeDirective include) {
PsiFile file = include.getIncludedFile();
if (processedFiles.contains(file)) {
return;
}
processedFiles.add(file);
result.append(include.getText());
}
@NotNull
public static String process(PsiFile file) {
IncludesProcessor processor = new IncludesProcessor();
processor.processFile(file);
return processor.result.toString();
}
}