/*******************************************************************************
* Copyright (c) 2014 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package dtool.engine.operations;
import java.nio.file.Path;
import melnorme.lang.tooling.ast.ASTNodeFinder;
import melnorme.lang.tooling.ast_actual.ASTNode;
import melnorme.lang.tooling.context.ISemanticContext;
import melnorme.lang.tooling.symbols.INamedElement;
import melnorme.utilbox.core.CommonException;
import dtool.ast.declarations.AttribBasic;
import dtool.ast.declarations.AttribBasic.AttributeKinds;
import dtool.ast.declarations.DeclarationAttrib;
import dtool.ast.declarations.IDeclaration;
import dtool.ast.definitions.DefSymbol;
import dtool.ast.definitions.DefinitionEnumVar;
import dtool.ast.definitions.DefinitionEnumVar.DefinitionEnumVarFragment;
import dtool.ast.definitions.DefinitionVariable.DefinitionAutoVariable;
import dtool.ast.definitions.Module;
import dtool.ast.references.AutoReference;
import dtool.ast.references.NamedReference;
import dtool.ddoc.TextUI;
import dtool.engine.ResolvedModule;
import dtool.engine.SemanticManager;
import dtool.engine.analysis.IVarDefinitionLike;
public class ResolveDocViewOperation extends AbstractDToolOperation {
public ResolveDocViewOperation(SemanticManager semanticManager, Path filePath, int offset, Path compilerPath,
String dubPath) throws CommonException {
super(semanticManager, filePath, offset, compilerPath, dubPath);
}
public String perform() throws CommonException {
ResolvedModule resolvedModule = getResolvedModule(fileLoc);
Module module = resolvedModule.getModuleNode();
ASTNode pickedNode = ASTNodeFinder.findElement(module, offset);
ISemanticContext mr = resolvedModule.getSemanticContext();
INamedElement relevantElementForDoc = null;
if(pickedNode instanceof DefSymbol) {
relevantElementForDoc = ((DefSymbol) pickedNode).getDefUnit();
} else if(pickedNode instanceof NamedReference) {
relevantElementForDoc = ((NamedReference) pickedNode).resolveTargetElement(mr);
} else if(pickedNode instanceof AutoReference) {
AutoReference autoReference = (AutoReference) pickedNode;
return getDDocHTMLViewForAutoLike(mr, autoReference.getParent_());
} else if(pickedNode instanceof AttribBasic) {
AttribBasic attribBasic = (AttribBasic) pickedNode;
if(attribBasic.attribKind == AttributeKinds.AUTO) {
if(attribBasic.getLexicalParent() instanceof DeclarationAttrib) {
DeclarationAttrib declAttrib = (DeclarationAttrib) attribBasic.getLexicalParent();
return getDDocHTMLViewForAuto(mr, declAttrib);
}
}
} else if(pickedNode instanceof DefinitionEnumVar) {
DefinitionEnumVar definitionEnumVar = (DefinitionEnumVar) pickedNode;
if(definitionEnumVar.isOffsetAtEnumKeyword(offset)) {
if(definitionEnumVar.defFragments.size() == 1) {
DefinitionEnumVarFragment firstEnumDef = definitionEnumVar.defFragments.get(0);
return getDDocHTMLViewForAutoLike(mr, firstEnumDef);
}
}
}
return relevantElementForDoc == null ? null : TextUI.getDDocHTMLRender(relevantElementForDoc);
}
protected String getDDocHTMLViewForAuto(ISemanticContext mr, DeclarationAttrib declAttrib) {
IDeclaration singleDecl = declAttrib.getSingleDeclaration();
if(singleDecl instanceof DefinitionAutoVariable) {
DefinitionAutoVariable defVar = (DefinitionAutoVariable) singleDecl;
if(defVar.getFragments().isEmpty()) {
return getDDocHTMLViewForAutoLike(mr, defVar);
}
}
return null;
}
protected String getDDocHTMLViewForAutoLike(ISemanticContext context, IVarDefinitionLike defVar) {
INamedElement resolvedType = defVar.getSemantics(context).getTypeForValueContext();
if(resolvedType.getArcheType().isError()) {
String reasonStr = resolvedType.getExtendedName();
return TextUI.span("semantic_error", "color:red;",
"<b> Error: Could not resolve auto initializer: <br/>" +reasonStr+ " </b>");
}
return TextUI.getDDocHTMLRender(resolvedType);
}
}