/* * Copyright 2013-2016 consulo.io * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package consulo.unity3d.scene.index; import java.util.HashMap; import java.util.Map; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import com.intellij.util.indexing.DataIndexer; import com.intellij.util.indexing.DefaultFileTypeSpecificInputFilter; import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.indexing.FileContent; import com.intellij.util.indexing.ID; import com.intellij.util.indexing.ScalarIndexExtension; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; import consulo.unity3d.scene.Unity3dYMLAssetFileType; /** * @author VISTALL * @since 22.12.2015 */ public class Unity3dYMLAssetIndexExtension extends ScalarIndexExtension<String> { public static final ID<String, Void> KEY = ID.create("unity3d.yml.asset.index"); private DataIndexer<String, Void, FileContent> myIndexer = new DataIndexer<String, Void, FileContent>() { @NotNull @Override public Map<String, Void> map(FileContent inputData) { Map<String, Void> map = new HashMap<String, Void>(); CharSequence contentAsText = inputData.getContentAsText(); for(int i = 0; i < contentAsText.length(); i++) { if(isGuid(i, contentAsText)) { i += 6; String cut = cut(i, i + 32, contentAsText); if(cut != null) { i += 32; map.put(cut, null); } } } return map; } @Nullable private String cut(int i, int max, CharSequence charSequence) { if(max >= charSequence.length()) { return null; } return charSequence.subSequence(i, max).toString(); } private boolean isGuid(int i, CharSequence contentAsText) { return contains(i, contentAsText, 'g') && contains(++i, contentAsText, 'u') && contains(++i, contentAsText, 'i') && contains(++i, contentAsText, 'd') && contains(++i, contentAsText, ':') && contains(++i, contentAsText, ' '); } private boolean contains(int i, CharSequence charSequence, char c) { return i < charSequence.length() && charSequence.charAt(i) == c; } }; private final EnumeratorStringDescriptor myKeyDescriptor = new EnumeratorStringDescriptor(); private final DefaultFileTypeSpecificInputFilter myInputFilter = new DefaultFileTypeSpecificInputFilter(Unity3dYMLAssetFileType.INSTANCE); @NotNull @Override public ID<String, Void> getName() { return KEY; } @NotNull @Override public DataIndexer<String, Void, FileContent> getIndexer() { return myIndexer; } @NotNull @Override public KeyDescriptor<String> getKeyDescriptor() { return myKeyDescriptor; } @NotNull @Override public FileBasedIndex.InputFilter getInputFilter() { return myInputFilter; } @Override public boolean dependsOnFileContent() { return true; } @Override public int getVersion() { return 1; } }