/* * Copyright 2010 Jon S Akhtar (Sylvanaar) * * 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 com.sylvanaar.idea.Lua.lang.psi.impl; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.sylvanaar.idea.Lua.LuaFileType; import com.sylvanaar.idea.Lua.debugger.LuaCodeFragment; import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocComment; import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocParameterReference; import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocReferenceElement; import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocTag; import com.sylvanaar.idea.Lua.lang.psi.*; import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaDeclarationExpression; import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaExpression; import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaExpressionList; import com.sylvanaar.idea.Lua.lang.psi.statements.*; import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaCompoundIdentifier; import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaIdentifier; import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaSymbol; /** * Created by IntelliJ IDEA. * User: Jon S Akhtar * Date: Apr 14, 2010 * Time: 7:16:01 PM */ public class LuaPsiElementFactoryImpl extends LuaPsiElementFactory { Project myProject; public LuaPsiElementFactoryImpl(Project project) { myProject = project; } @Override public LuaExpression createExpressionFromText(String newExpression) { LuaPsiFile file = createDummyFile("return " + newExpression); LuaReturnStatement ret = (LuaReturnStatement) file.getStatements()[0]; LuaExpressionList exprs = (LuaExpressionList) ret.getReturnValue(); return exprs.getLuaExpressions().get(0); } @Override public LuaStatementElement createStatementFromText(String newStatement) { LuaPsiFile file = createDummyFile(newStatement); return file.getStatements()[0]; } @Override public PsiComment createCommentFromText(String s, PsiElement parent) { LuaPsiFile file = createDummyFile(s); return (PsiComment) file.getChildren()[0]; } public PsiElement createWhiteSpaceFromText(String text) { LuaPsiFile file = createDummyFile(text); return file.getChildren()[0]; } private LuaPsiFile createDummyFile(String s, boolean isPhisical) { return (LuaPsiFile) PsiFileFactory.getInstance(myProject) .createFileFromText("DUMMY__." + LuaFileType.LUA_FILE_TYPE.getDefaultExtension(), LuaFileType.LUA_FILE_TYPE, s, System.currentTimeMillis(), isPhisical); } private LuaPsiFile createDummyFile(String s) { return createDummyFile(s, false); } public PsiFile createLuaFile(String idText) { return createLuaFile(idText, false, null); } public LuaPsiFile createLuaFile(String idText, boolean isPhisical, PsiElement context) { LuaPsiFile file = createDummyFile(idText, isPhisical); //file.setContext(context); return file; } // public static ASTNode createLocalNameIdentifier(Project project, String name) { // return null; //To change body of created methods use File | Settings | File Templates. // } @Override public LuaSymbol createReferenceNameFromText(String newElementName) { LuaPsiFile file = createDummyFile(newElementName + " = nil"); if (! (file.getFirstChild() instanceof LuaAssignmentStatement) ) return null; LuaAssignmentStatement assign = (LuaAssignmentStatement) file.getFirstChild(); assert assign != null; if (assign.getLeftExprs().count()!=1) return null; LuaSymbol e = assign.getLeftExprs().getSymbols()[0]; if (e.getText().equals(newElementName)) return e; return null; } @Override public LuaDeclarationExpression createLocalNameIdentifierDecl(String name) { LuaPsiFile file = createDummyFile("local " + name); final LuaLocalDefinitionStatement expressionStatement = (LuaLocalDefinitionStatement) file.getFirstChild(); final LuaDeclarationExpression declaration = expressionStatement.getDeclarations()[0]; return declaration; } public LuaIdentifier createLocalNameIdentifier(String name) { int firstDot = name.indexOf('.'); String prefix = name.substring(0, firstDot>0?firstDot:name.length()); LuaPsiFile file = createDummyFile("local " + prefix + "; " + name + " = nil"); final LuaAssignmentStatement expressionStatement = (LuaAssignmentStatement) file.getStatements()[1]; final LuaReferenceElement ref = (LuaReferenceElement) expressionStatement.getLeftExprs().getFirstChild(); return (LuaIdentifier) ref.getElement(); } public LuaDeclarationExpression createGlobalNameIdentifierDecl(String name) { LuaPsiFile file = createDummyFile(name + "=true"); final LuaAssignmentStatement expressionStatement = (LuaAssignmentStatement) file.getFirstChild(); final LuaDeclarationExpression declaration = (LuaDeclarationExpression) expressionStatement.getLeftExprs().getFirstChild().getFirstChild(); return declaration; } @Override public LuaDeclarationExpression createParameterNameIdentifier(String name) { LuaPsiFile file = createDummyFile("function a("+name+") end"); final LuaFunctionDefinitionStatement functionDef = (LuaFunctionDefinitionStatement) file.getFirstChild(); assert functionDef != null; return functionDef.getParameters().getLuaParameters()[0]; } @Override public LuaExpressionCodeFragment createExpressionCodeFragment(String text, LuaPsiElement context, boolean b) { //LuaPsiFile file = createDummyFile(text); LuaCodeFragment file = new LuaCodeFragment(myProject, text); return (LuaExpressionCodeFragment) file; } @Override public LuaDocComment createDocCommentFromText(String s) { LuaPsiFile file = createDummyFile(s); PsiElement e = file.getFirstChild(); assert e instanceof LuaDocComment; return (LuaDocComment) e; } @Override public LuaDocReferenceElement createDocFieldReferenceNameFromText(String elementName) { LuaPsiFile file = createDummyFile("--- @field " + elementName + "\nlocal a={" + elementName + "=true}"); LuaDocComment comment = (LuaDocComment) file.getFirstChild(); assert comment != null; LuaDocTag tag = comment.getTags()[0]; return tag.getDocFieldReference(); } @Override public LuaDocParameterReference createParameterDocMemberReferenceNameFromText(String elementName) { LuaPsiFile file = createDummyFile("--- @param " + elementName + "\nfunction(" + elementName + ")"); LuaDocComment comment = (LuaDocComment) file.getFirstChild(); assert comment != null; LuaDocTag tag = comment.getTags()[0]; return tag.getDocParameterReference(); } public LuaIdentifier createGlobalNameIdentifier(String name) { LuaPsiFile file = createDummyFile(name + "=true; nop=" + name); final LuaAssignmentStatement expressionStatement = (LuaAssignmentStatement) file.getStatements()[1]; final LuaReferenceElement ref = (LuaReferenceElement) expressionStatement.getRightExprs().getFirstChild(); return (LuaIdentifier) ref.getElement(); } @Override public LuaIdentifier createFieldNameIdentifier(String name) { LuaPsiFile file = createDummyFile("a."+name+"=nil"); LuaAssignmentStatement assign = (LuaAssignmentStatement) file.getFirstChild(); assert assign != null; LuaReferenceElement element = assign.getLeftExprs().getReferenceExprs()[0]; LuaCompoundIdentifier id = (LuaCompoundIdentifier) element.getElement(); return (LuaIdentifier) id.getRightSymbol(); } }