/******************************************************************************* * Copyright (c) 2005, 2006 committers of openArchitectureWare and others. * 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: * committers of openArchitectureWare - initial API and implementation *******************************************************************************/ package org.eclipse.xtend.shared.ui.expression.editor.codeassist; import java.util.List; import org.eclipse.internal.xtend.expression.codeassist.AbstractProposalFactory; import org.eclipse.internal.xtend.xtend.ast.Extension; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.swt.graphics.Image; import org.eclipse.xpand2.XpandUtil; import org.eclipse.xtend.expression.TypeNameUtil; import org.eclipse.xtend.shared.ui.expression.editor.EditorImages; import org.eclipse.xtend.typesystem.Operation; import org.eclipse.xtend.typesystem.ParameterizedType; import org.eclipse.xtend.typesystem.Property; import org.eclipse.xtend.typesystem.StaticProperty; import org.eclipse.xtend.typesystem.Type; public class ProposalFactoryEclipseImpl extends AbstractProposalFactory { public int offset; public ProposalFactoryEclipseImpl(final int offset) { this.offset = offset; } public ICompletionProposal createCollectionSpecificOperationProposal(final String insertString, final String displayString, final String prefix, final int cursor, final int marked) { final String displayStr = displayString; final String insertStr = insertString; final Image img = EditorImages.getImage(EditorImages.OPERATION); return new TextSelectingProposal(insertStr, offset - prefix.length(), prefix.length(), cursor, marked, img, displayStr, null, null); } public ICompletionProposal createPropertyProposal(final Property p, final String prefix, final boolean onOperation) { final String returnType = computeReturnType(p.getReturnType(), onOperation); final String displayStr = p.getName() + " " + returnType + " - " + TypeNameUtil.getSimpleName(p.getOwner().getName()); final String insertStr = p.getName(); final Image img = EditorImages.getImage(EditorImages.PROPERTY); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } /** * @see ProposalFactory#createStaticPropertyProposal(StaticProperty, String, * boolean) */ public ICompletionProposal createStaticPropertyProposal(final StaticProperty p, final String prefix, final boolean onOperation) { final String returnType = computeReturnType(p.getReturnType(), onOperation); final String displayStr = p.getName() + " " + returnType + " - " + TypeNameUtil.getSimpleName(p.getOwner().getName()); final String insertStr = p.getName(); final Image img = EditorImages.getImage(EditorImages.STATICPROPERTY); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } protected String computeReturnType(Type returnType, final boolean onOperation) { if (returnType == null) { return "unknown"; } if (onOperation) { if (returnType instanceof ParameterizedType) { returnType = ((ParameterizedType) returnType).getInnerType(); } return "List[" + XpandUtil.getLastSegment(returnType.getName()) + "]"; } StringBuilder result = new StringBuilder(); computeReturnType(returnType, result); return result.toString(); } private void computeReturnType(Type returnType, StringBuilder result) { if (returnType == null) { result.append("unknown"); return; } if (returnType instanceof ParameterizedType) { result.append(TypeNameUtil.getSimpleName(returnType.getName())); result.append('['); computeReturnType(((ParameterizedType) returnType).getInnerType(), result); result.append(']'); } else { result.append(TypeNameUtil.getSimpleName(returnType.getName())); } } public ICompletionProposal createOperationProposal(final Operation p, final String prefix, final boolean onOperation) { final String returnType = computeReturnType(p.getReturnType(), onOperation); final String displayStr = p.getName() + toParamString(p.getParameterTypes()) + " " + returnType + " - " + TypeNameUtil.getSimpleName(p.getOwner().getName()); final String insertStr = p.getName() + "()"; int x = insertStr.length(); if (p.getParameterTypes().size() > 0) { x--; } final Image img = EditorImages.getImage(EditorImages.OPERATION); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), x, img, displayStr, null, null); } public ICompletionProposal createExtensionProposal(final Extension p, final String prefix) { final String displayStr = p.getName() + toParamString(p, false); final String insertStr = p.getName() + "()"; int x = insertStr.length(); if (p.getFormalParameters().size() > 0) { x--; } final Image img = EditorImages.getImage(EditorImages.EXTENSION); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), x, img, displayStr, null, null); } public ICompletionProposal createExtensionOnMemberPositionProposal(final Extension p, final String prefix, final boolean onOperation) { final String displayStr = p.getName() + toParamString(p, true) + " - " + (p.getFormalParameters().get(0)).getType(); final String insertStr = p.getName() + "()"; int x = insertStr.length(); if (p.getFormalParameters().size() > 1) { x--; } final Image img = EditorImages.getImage(EditorImages.EXTENSION); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), x, img, displayStr, null, null); } private String toParamString(final List<Type> parameterTypes) { final StringBuffer b = new StringBuffer("("); for (int i = 0, x = parameterTypes.size(); i < x; i++) { b.append(TypeNameUtil.getSimpleName(parameterTypes.get(i).getName())); if (i + 1 < x) { b.append(","); } } b.append(")"); return b.toString(); } private String toParamString(final Extension p, final boolean member) { final StringBuffer b = new StringBuffer("("); int i = member ? 1 : 0; for (final int x = p.getFormalParameters().size(); i < x; i++) { b.append((p.getFormalParameters().get(i)).toString()); if (i + 1 < x) { b.append(","); } } b.append(")"); return b.toString(); } public ICompletionProposal createVariableProposal(final String name, final Type t, final String prefix) { final String displayStr = name + " " + computeReturnType(t, false); final String insertStr = name; final Image img = EditorImages.getImage(EditorImages.VARIABLE); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } public ICompletionProposal createTypeProposal(final String insertString, final Type type, final String prefix) { String displayStr = TypeNameUtil.getSimpleName(type.getName()); final String packName = TypeNameUtil.withoutLastSegment(type.getName()); if (packName != null) { displayStr += " - " + packName; } final String insertStr = insertString; final Image img = EditorImages.getImage(EditorImages.TYPE); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } public ICompletionProposal createExtensionImportProposal(final String insertStr, final String displayStr, final String prefix, final int cursor, final int marked) { final Image img = EditorImages.getImage(EditorImages.EXT_IMPORT); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } public ICompletionProposal createNamespaceProposal(final String insertStr, final String displayStr, final String prefix) { final Image img = EditorImages.getImage(EditorImages.PACKAGE); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } public ICompletionProposal createDefinitionProposal(final String insertStr, final String displayStr, final String prefix) { final Image img = EditorImages.getImage(EditorImages.XPAND_DEFINE); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } public ICompletionProposal createStatementProposal(final String insertStr, final String displayStr, final String prefix, final int cursor, final int marked) { final Image img = EditorImages.getImage(EditorImages.EXT_IMPORT); return new CompletionProposal(insertStr, offset - prefix.length(), prefix.length(), insertStr.length(), img, displayStr, null, null); } public ICompletionProposal createStatementProposal(final String insertString, final String displayString, final String prefix) { throw new UnsupportedOperationException(); } public ICompletionProposal createKeywordProposal(final String insertString, final String displayString, final String prefix) { throw new UnsupportedOperationException(); } }