package com.github.jknack.antlr4ide.ui.decorator; import org.eclipse.jface.viewers.ILightweightLabelDecorator; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import java.io.BufferedReader; import java.io.InputStreamReader; public class Antlr4SuffixDecorator implements ILightweightLabelDecorator { // For the ANTLR4 generated java files has first line indicating origin // >// Generated from testissue.g4 by ANTLR 4.5.1< // For the generated tokens files use the filename itself as indication of origin. static final String[] checkSuffixes={"Lexer.tokens","Parser.tokens",".tokens" }; static final int[] checkSuffixesLen={checkSuffixes[0].length(),checkSuffixes[1].length(),checkSuffixes[2].length()}; public void decorate(Object element, IDecoration decoration) { // Note: the plugin.xml specify which types are passed through element to this decorator IResource resource=(IResource)element; // System.out.println(" Antlr4SuffixDecorator decorate Object>"+element.getClass()+"<" // + ">"+resource.getName()+"<" // + ">"+resource.getFullPath()+"<" // relative to workspace root // + ">"+resource.getRawLocation()+"<" // full file system path // ); if(resource.getType()!=IResource.FILE) return; if(!resource.isDerived()) return; String resourceName = resource.getName(); if(resourceName.endsWith(".java")) { // what about other target types? // read first line BufferedReader in=null; try { in = new BufferedReader(new InputStreamReader(((IFile)resource).getContents())); String text = in.readLine(); in.close(); if (text.startsWith("// Generated from ")) { String[] strArray = text.split(" "); decoration.addSuffix(" ["+strArray[3]+"]"); } } catch (Exception e) { e.printStackTrace(); } } else { for (int i=0;i<checkSuffixes.length;i++) { if(resourceName.endsWith(checkSuffixes[i])) { decoration.addSuffix(asDecoratorSuffix(resourceName,checkSuffixesLen[i],".g4")); break; // stop at first match } } } } private String asDecoratorSuffix(String fileName) { return " ["+fileName+"]"; } private String asDecoratorSuffix(String resourceName, int resourceSuffixLen, String ext) { return asDecoratorSuffix(resourceName.substring(0,resourceName.length()-resourceSuffixLen)+ext); } public void addListener(ILabelProviderListener listener) { } public void removeListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } }