nesccodecompletionprocessor.java

来自「plugin for eclipse」· Java 代码 · 共 193 行

JAVA
193
字号
package isis.tinydt.editors.nesceditor;

import isis.anp.common.ParserMessage;
import isis.anp.nesc.common.NesCObjectTreeBuilderContext;
import isis.anp.nesc.ot.FunctionDeclaration;
import isis.anp.nesc.ot.Interface;
import isis.anp.nesc.ot.InterfacePort;
import isis.anp.nesc.ot.NesCFile;
import isis.anp.nesc.ot.NesCModuleFile;
import isis.anp.nesc.ot.Port;
import isis.anp.nesc.ot.scope.Scope;
import isis.anp.nesc.ot.scope.Symbol;
import isis.commons.fs.CanonicalPath;
import isis.tinydt.TinydtProject;
import isis.tinydt.Utils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;



public class NesCCodeCompletionProcessor implements IContentAssistProcessor 
{
    private ITextEditor editor;
    
    public NesCCodeCompletionProcessor( ITextEditor editor )
    {
        this.editor = editor;
    }
    
	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) 
    {
        //IRegion r = viewer.getDocument().getLineInformationOfOffset(3);

        
        //IFileEditorInput input = (IFileEditorInput)editor.getEditorInput();
        //IFile f = input.getFile();            
        //System.out.println( f.getFullPath() );

		return test3(viewer,offset);
        //return null;
	}
        
    private TinydtProject getProject()
    {
        IFileEditorInput input = (IFileEditorInput)editor.getEditorInput();
        IFile f = input.getFile();        
        return TinydtProject.getTinydtProject(f.getProject());       
    }
    
    private static String getLastToken( ITextViewer viewer )
    {
        String text = viewer.getDocument().get();
        int pos = viewer.getSelectedRange().x-2;
        
        int len = 0;
        char c = text.charAt(pos);
        while( pos>=0 && c!=' ' && c!='\t' )
        {           
            pos--;            
            len++;
            c = text.charAt(pos);
        }        
        String token = text.substring(pos+1,pos+len+1);                
        System.out.println("last_token="+token);            
        return token;        
    }
    
    
    private ICompletionProposal[] test3(ITextViewer viewer, int offset)
    {
        System.out.println("NesCCodeCompletionProcessor.test3");
        
        // get file
        IFile file = ((IFileEditorInput)editor.getEditorInput()).getFile();        
        TinydtProject proj = getProject();
        NesCObjectTreeBuilderContext ctx = proj.getObjectTreeCtx();
        NesCFile f = null;
		try {
			f = ctx.getProcessedObjectTree(file.getLocation().lastSegment().toString());
		} catch (ParserMessage e) {
			// we assume it has already been parsed, and the errors are shown
		}        
        if( f==null )
            return null;
        
        List props = new ArrayList();
        String lastToken = getLastToken(viewer);

        if( f instanceof NesCModuleFile )
        {
            Port p = ((NesCModuleFile)f).getModule().getPortByName(lastToken);
            if( p!=null )
            {
                if( p instanceof InterfacePort )
                {                                       
                    Interface i = ((InterfacePort)p).getInterface();
                    Iterator it = i.getFunctionDeclarations().iterator();
                    while( it.hasNext() )
                    {                        
                        FunctionDeclaration decl = (FunctionDeclaration)it.next();
                        String repl = decl.getName()+"()";                        
                        props.add(new CompletionProposal(repl,viewer.getSelectedRange().x,0,repl.length()-1,null,Utils.getFuncDeclString(decl),null,null) );                       
                    }
                }                                               
            }            
        }               

        
        ICompletionProposal propsArray[] = new ICompletionProposal[props.size()];
        for( int i=0; i<props.size(); ++i )
            propsArray[i] = (ICompletionProposal)props.get(i);        
        return propsArray;      
    }
    
    private ICompletionProposal[] test2()
    {
        int i;
        List props = new ArrayList();
        
        //props.add( new CompletionProposal("alma1",0,5,0) );
        //props.add( new CompletionProposal("alma2",0,5,0) );
        
        TinydtProject proj = getProject();        
        NesCObjectTreeBuilderContext ctx = proj.getObjectTreeCtx();
        Iterator it = ctx.getObjectTrees().iterator();
        while (it.hasNext()) 
        {
            NesCFile ncf = (NesCFile) it.next();            
            if( ncf instanceof NesCModuleFile )
            {
                Scope scope = ((NesCModuleFile)ncf).getModule().getImplementation().getScope();
                //System.out.println(scope);
                List symbols = scope.getSymbolList();
                //System.out.println(symbols);
                Iterator it2 = symbols.iterator();
                while( it2.hasNext() )
                {
                    Symbol symbol = (Symbol)it2.next();
                    props.add( new CompletionProposal( symbol.getName(),0,5,0) );        
                }
            }
        }

        ICompletionProposal propsArray[] = new ICompletionProposal[props.size()];
        for( i=0; i<props.size(); ++i )
            propsArray[i] = (ICompletionProposal)props.get(i);        
        return propsArray;      
    }
    
    
    
    

	public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset)
    {
		return null;
	}

	public char[] getCompletionProposalAutoActivationCharacters() 
    {
        return new char[]{'.'};
	}

	public char[] getContextInformationAutoActivationCharacters() 
    {
        //char a[] = {'.'};
        return null;
	}

	public IContextInformationValidator getContextInformationValidator() 
    {
		return null;
	}

	public String getErrorMessage() 
    {
		return null;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?