// Path: src/cmake/filetypes/CMakeFile.java
// public class CMakeFile extends PsiFileBase{
//     public static CMakeFile create(@NotNull FileViewProvider viewProvider) {
//         return new CMakeFile(viewProvider);
//     }
//     protected CMakeFile(@NotNull FileViewProvider viewProvider) {
//         super(viewProvider, CMakeLanguage.INSTANCE);
//     }
// 
//     @NotNull
//     @Override
//     public FileType getFileType() {
//         return CMakeFileType.INSTANCE;
//     }
// 
//     @Override
//     public String toString() {
//         return "CMake";
//     }
// 
//     @Override
//     public Icon getIcon(int flags) {
//         return super.getIcon(flags);
//     }
// }
// 
// Path: src/cmake/filetypes/CMakeFileType.java
// public class CMakeFileType extends LanguageFileType {
//     public static final CMakeFileType INSTANCE = new CMakeFileType();
//     private static final String[] DEFAULT_EXTENSIONS = {"cmake","txt"};
// 
//     protected CMakeFileType() {
//         super(CMakeLanguage.INSTANCE);
//     }
// 
//     @NotNull
//     @Override
//     public String getName() {
//         return "CMake";
//     }
// 
//     @NotNull
//     @Override
//     public String getDescription() {
//         return "CMake build system file";
//     }
// 
//     @NotNull
//     @Override
//     public String getDefaultExtension() {
//         return DEFAULT_EXTENSIONS[0];
//     }
// 
//     @Nullable
//     @Override
//     public Icon getIcon() {
//         return CMakeIcons.FILE;
//     }
// 
//     @Override
//     public boolean isReadOnly() {
//         return false;
//     }
// 
//     @Nullable
//     @Override
//     public String getCharset(@NotNull VirtualFile virtualFile, @NotNull byte[] bytes) {
//         Charset charset = EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(virtualFile);
//         if (charset == null) {
//             charset = CharsetToolkit.getDefaultSystemCharset();
//         }
//         return charset.name();
//     }
// }
// 
// Path: src/cmake/icons/CMakeIcons.java
// public class CMakeIcons {
//     public static final Icon FILE = IconLoader.getIcon("/icons/cmake.png");
//     public static final Icon MACRO = IconLoader.getIcon("/icons/hashtag.png");
//     public static final Icon FUN = IconLoader.getIcon("/icons/fun.jpg");
//     public static final Icon LOOP = IconLoader.getIcon("/icons/loop.png");
// }


import cmake.filetypes.CMakeFile;
import cmake.filetypes.CMakeFileType;
import cmake.icons.CMakeIcons;
import cmake.psi.*;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
import com.intellij.psi.search.FileTypeIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.PairProcessor;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
            public String getLocationString() {
                return element.getContainingFile().getName();
            }

            @Nullable
            @Override
            public Icon getIcon(boolean unused) {
                
                if(element.getFirstChild().getText().contains("function"))
                    return CMakeIcons.FUN;
                else if(element.getFirstChild().getText().contains("macro"))
                    return CMakeIcons.MACRO;
                else if(element.getFirstChild().getText().contains("set")
                            || element.getFirstChild().getText().contains("list")
                            || element.getFirstChild().getText().contains("option"))
                {
                    return CMakeIcons.FILE;
                }
                return null;
            }
        };
    }

    public static List<PsiElement> getDefinedSymbols(Project project) {
        final List<PsiElement> result = new ArrayList<PsiElement>();
        Collection<VirtualFile> virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, 
                CMakeFileType.INSTANCE,
                GlobalSearchScope.allScope(project));
        // Scan each file for named entities
        for (VirtualFile virtualFile : virtualFiles) {
// Path: src/cmake/filetypes/CMakeFile.java
// public class CMakeFile extends PsiFileBase{
//     public static CMakeFile create(@NotNull FileViewProvider viewProvider) {
//         return new CMakeFile(viewProvider);
//     }
//     protected CMakeFile(@NotNull FileViewProvider viewProvider) {
//         super(viewProvider, CMakeLanguage.INSTANCE);
//     }
// 
//     @NotNull
//     @Override
//     public FileType getFileType() {
//         return CMakeFileType.INSTANCE;
//     }
// 
//     @Override
//     public String toString() {
//         return "CMake";
//     }
// 
//     @Override
//     public Icon getIcon(int flags) {
//         return super.getIcon(flags);
//     }
// }
// 
// Path: src/cmake/filetypes/CMakeFileType.java
// public class CMakeFileType extends LanguageFileType {
//     public static final CMakeFileType INSTANCE = new CMakeFileType();
//     private static final String[] DEFAULT_EXTENSIONS = {"cmake","txt"};
// 
//     protected CMakeFileType() {
//         super(CMakeLanguage.INSTANCE);
//     }
// 
//     @NotNull
//     @Override
//     public String getName() {
//         return "CMake";
//     }
// 
//     @NotNull
//     @Override
//     public String getDescription() {
//         return "CMake build system file";
//     }
// 
//     @NotNull
//     @Override
//     public String getDefaultExtension() {
//         return DEFAULT_EXTENSIONS[0];
//     }
// 
//     @Nullable
//     @Override
//     public Icon getIcon() {
//         return CMakeIcons.FILE;
//     }
// 
//     @Override
//     public boolean isReadOnly() {
//         return false;
//     }
// 
//     @Nullable
//     @Override
//     public String getCharset(@NotNull VirtualFile virtualFile, @NotNull byte[] bytes) {
//         Charset charset = EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(virtualFile);
//         if (charset == null) {
//             charset = CharsetToolkit.getDefaultSystemCharset();
//         }
//         return charset.name();
//     }
// }
// 
// Path: src/cmake/icons/CMakeIcons.java
// public class CMakeIcons {
//     public static final Icon FILE = IconLoader.getIcon("/icons/cmake.png");
//     public static final Icon MACRO = IconLoader.getIcon("/icons/hashtag.png");
//     public static final Icon FUN = IconLoader.getIcon("/icons/fun.jpg");
//     public static final Icon LOOP = IconLoader.getIcon("/icons/loop.png");
// }


// Path: src/cmake/parsing/CMakeParserUtilImpl.java
import cmake.filetypes.CMakeFile;
import cmake.filetypes.CMakeFileType;
import cmake.icons.CMakeIcons;
import cmake.psi.*;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
import com.intellij.psi.search.FileTypeIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.PairProcessor;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

            public String getLocationString() {
                return element.getContainingFile().getName();
            }

            @Nullable
            @Override
            public Icon getIcon(boolean unused) {
                
                if(element.getFirstChild().getText().contains("function"))
                    return CMakeIcons.FUN;
                else if(element.getFirstChild().getText().contains("macro"))
                    return CMakeIcons.MACRO;
                else if(element.getFirstChild().getText().contains("set")
                            || element.getFirstChild().getText().contains("list")
                            || element.getFirstChild().getText().contains("option"))
                {
                    return CMakeIcons.FILE;
                }
                return null;
            }
        };
    }

    public static List<PsiElement> getDefinedSymbols(Project project) {
        final List<PsiElement> result = new ArrayList<PsiElement>();
        Collection<VirtualFile> virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, 
                CMakeFileType.INSTANCE,
                GlobalSearchScope.allScope(project));
        // Scan each file for named entities
        for (VirtualFile virtualFile : virtualFiles) {
            CMakeFile cmakeFile = (CMakeFile) PsiManager.getInstance(project).findFile(virtualFile);