/******************************************************************************* * Copyright (c) 2005, 2012 eBay Inc. * 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 * *******************************************************************************/ package org.eclipse.vjet.eclipse.internal.ui.text.completion; import java.text.MessageFormat; import java.util.List; import org.eclipse.vjet.dsf.jst.IJstType; import org.eclipse.vjet.eclipse.core.IVjoSourceModule; import org.eclipse.vjet.eclipse.internal.core.util.Util; import org.eclipse.dltk.mod.core.DLTKCore; import org.eclipse.dltk.mod.core.IBuffer; import org.eclipse.dltk.mod.core.IType; import org.eclipse.dltk.mod.core.ModelException; import org.eclipse.dltk.mod.internal.core.VjoExternalSourceModule; import org.eclipse.dltk.mod.internal.core.VjoSourceType; import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MultiTextEdit; /** * This class insert "needs('yyy')" string after "xtype('xxxx')" string when * completed static class. * * * */ public class ImportRewriter { private static final String CLOSE_BRACKET = ")"; private static final String TYPE = "type"; private static final String VJO_IMPORT = "\r\n.needs(\"{0}\")"; public MultiTextEdit rewrite(VjoSourceType type, IJstType ownerType) { MultiTextEdit edit = new MultiTextEdit(); IVjoSourceModule module = (IVjoSourceModule) type.getSourceModule(); String name = module.getTypeName().typeName(); boolean isNative = module instanceof VjoExternalSourceModule; if (!isNative && !existImport(ownerType, name) && !isOwnerType(ownerType, name)) { IType itype = Util.toIType(ownerType); addImport(itype, edit, name); } return edit; } private boolean isOwnerType(IJstType ownerType, String name) { return ownerType.getName().equals(name); } private boolean existImport(IJstType ownerType, String name) { boolean exist = false; List<? extends IJstType> list = ownerType.getImports(); for (IJstType jstType : list) { if (name.equals(jstType.getName())) { exist = true; break; } } return exist; } private void addImport(IType type, MultiTextEdit edit, String name) { int index = getTypeEndOffset(type); if (index != -1) { String s = MessageFormat.format(VJO_IMPORT, name); InsertEdit insertEdit; insertEdit = new InsertEdit(index + CLOSE_BRACKET.length(), s); edit.addChild(insertEdit); } } private int getTypeEndOffset(IType type) { int index = -1; try { IBuffer source = type.getSourceModule().getBuffer(); String s = String.valueOf(source.getCharacters()); index = s.indexOf(TYPE); if (index != -1) { index = s.indexOf(CLOSE_BRACKET, index); } } catch (ModelException e) { DLTKCore.error(e.toString(), e); } return index; } }