package com.redhat.ceylon.eclipse.code.correct; import static java.lang.Character.charCount; import static java.lang.Character.isUpperCase; import static java.lang.Character.toChars; import static java.lang.Character.toLowerCase; import static java.lang.Character.toUpperCase; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.TextFileChange; import org.eclipse.text.edits.ReplaceEdit; import com.redhat.ceylon.compiler.typechecker.tree.Node; import com.redhat.ceylon.compiler.typechecker.tree.Tree; import com.redhat.ceylon.compiler.typechecker.tree.Tree.Identifier; public class ChangeInitialCaseOfIdentifierInDeclaration extends CorrectionProposal { public static void addChangeIdentifierCaseProposal(Node node, Collection<ICompletionProposal> proposals, IFile file) { Tree.Identifier identifier = null; if (node instanceof Tree.Declaration) { Tree.Declaration td = (Tree.Declaration) node; Identifier id = td.getIdentifier(); if (!id.getText().isEmpty()) { identifier = id; } } else if (node instanceof Tree.ImportPath) { Tree.ImportPath ip = (Tree.ImportPath) node; List<Identifier> id = ip.getIdentifiers(); for (Identifier importIdentifier : id) { String text = importIdentifier.getText(); if (text != null && !text.isEmpty() && Character.isUpperCase(text.charAt(0))) { identifier = importIdentifier; break; } } } if (identifier != null) { addProposal(identifier, proposals, file); } } private static void addProposal(Identifier identifier, Collection<ICompletionProposal> proposals, IFile file) { String oldIdentifier = identifier.getText(); int first = oldIdentifier.codePointAt(0); int newFirst = isUpperCase(first) ? toLowerCase(first) : toUpperCase(first); String newFirstLetter = new String(toChars(newFirst)); String newIdentifier = newFirstLetter + oldIdentifier.substring(charCount(first)); TextFileChange change = new TextFileChange( "Change initial case of identifier", file); change.setEdit(new ReplaceEdit( identifier.getStartIndex(), 1, newFirstLetter)); ChangeInitialCaseOfIdentifierInDeclaration proposal = new ChangeInitialCaseOfIdentifierInDeclaration( newIdentifier, change); if (!proposals.contains(proposal)) { proposals.add(proposal); } } public ChangeInitialCaseOfIdentifierInDeclaration( String newIdentifier, Change change) { super("Change initial case of identifier to '" + newIdentifier + "'", change, null); } }