/* * Copyright 2011 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.luadoc.editor; import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegate; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleManager; import com.sylvanaar.idea.Lua.lang.luadoc.parser.LuaDocElementTypes; import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocComment; import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocCommentOwner; import com.sylvanaar.idea.Lua.lang.psi.LuaPsiFile; import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaExpression; import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaFieldIdentifier; import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaKeyValueInitializer; import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaTableConstructor; import com.sylvanaar.idea.Lua.lang.psi.statements.LuaFunctionDefinitionStatement; import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaParameter; /** * Created by IntelliJ IDEA. * User: Jon S Akhtar * Date: 4/2/11 * Time: 6:54 PM */ public class LuaDocEnterHandlerDelegate implements EnterHandlerDelegate { @Override public Result preprocessEnter(PsiFile file, Editor editor, Ref<Integer> caretOffset, Ref<Integer> caretAdvance, DataContext dataContext, EditorActionHandler originalHandler) { if (! (file instanceof LuaPsiFile)) return Result.Continue; Document document = editor.getDocument(); int caret = caretOffset.get(); PsiElement e1 = file.findElementAt(caret - 1); if (e1 != null && e1.getNode().getElementType() == LuaDocElementTypes.LDOC_COMMENT_START) { // The user has typed the doc comment start and hit enter. // we want to autogenerate the luadocs String indent = CodeStyleManager .getInstance(file.getProject()).getLineIndent(file, editor.getCaretModel().getOffset()); StringBuilder luadoc = new StringBuilder().append(" \n"); PsiDocumentManager.getInstance(file.getProject()).commitDocument(document); e1 = file.findElementAt(caret - 1); if (e1 != null && e1.getContext() instanceof LuaDocComment) { LuaDocComment comment = (LuaDocComment) e1.getContext(); assert comment != null; LuaDocCommentOwner owner = comment.getOwner(); if (owner != null) { if (owner instanceof LuaFunctionDefinitionStatement) { LuaParameter[] parms = ((LuaFunctionDefinitionStatement) owner).getParameters() .getLuaParameters(); for (LuaParameter p : parms) luadoc.append(indent).append("-- @param ").append(p.getName()).append(" \n"); luadoc.append(indent).append("--"); } else if (owner instanceof LuaTableConstructor) { LuaExpression[] initalizers = ((LuaTableConstructor) owner).getInitializers(); for (LuaExpression expression : initalizers) if (expression instanceof LuaKeyValueInitializer) { LuaExpression key = ((LuaKeyValueInitializer) expression).getFieldKey(); if (key instanceof LuaFieldIdentifier) luadoc.append(indent).append("-- @field ").append(((LuaFieldIdentifier) key).getName()).append(" \n"); } luadoc.append(indent).append("--"); } document.insertString(caret, luadoc); editor.getCaretModel().moveCaretRelatively(1, 0, false, false, false); return Result.Stop; } } } return Result.Continue; } }