| /******************************************************************************* |
| * Copyright (c) 2008, 2017 xored software, Inc. 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: |
| * xored software, Inc. - initial API and Implementation (Andrei Sobolev) |
| *******************************************************************************/ |
| |
| package org.eclipse.dltk.tcl.internal.validators.checks; |
| |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.dltk.core.IScriptProject; |
| import org.eclipse.dltk.core.builder.ISourceLineTracker; |
| import org.eclipse.dltk.core.mixin.IMixinElement; |
| import org.eclipse.dltk.core.mixin.IMixinRequestor; |
| import org.eclipse.dltk.tcl.ast.StringArgument; |
| import org.eclipse.dltk.tcl.ast.TclArgument; |
| import org.eclipse.dltk.tcl.ast.TclCommand; |
| import org.eclipse.dltk.tcl.internal.core.search.mixin.TclMixinModel; |
| import org.eclipse.dltk.tcl.internal.core.search.mixin.model.TclProc; |
| import org.eclipse.dltk.tcl.internal.validators.ICheckKinds; |
| import org.eclipse.dltk.tcl.parser.ITclErrorReporter; |
| import org.eclipse.dltk.tcl.parser.TclParserUtils; |
| import org.eclipse.dltk.tcl.parser.TclVisitor; |
| import org.eclipse.dltk.tcl.validators.ITclCheck; |
| |
| public class UndefinedProcCheck implements ITclCheck { |
| |
| public UndefinedProcCheck() { |
| } |
| |
| public void checkCommands(List<TclCommand> commands, |
| final ITclErrorReporter reporter, Map<String, String> options, |
| final IScriptProject project, |
| ISourceLineTracker sourceLineTracker) { |
| TclParserUtils.traverse(commands, new TclVisitor() { |
| @Override |
| public boolean visit(TclCommand command) { |
| |
| if (command.getDefinition() != null) { |
| return true; |
| } |
| TclArgument name = command.getName(); |
| if (!(name instanceof StringArgument)) { |
| return true; |
| } |
| String qName = command.getQualifiedName(); |
| if (qName == null) { |
| return true; |
| } |
| IMixinElement[] elements = TclMixinModel.getInstance() |
| .getMixin(project) |
| .find(qName.replaceAll("::", |
| IMixinRequestor.MIXIN_NAME_SEPARATOR), |
| new NullProgressMonitor()); |
| String realName = ((StringArgument) name).getValue(); |
| if (realName.indexOf("::") != -1) { |
| realName = realName |
| .substring(realName.lastIndexOf("::") + 2); |
| } |
| boolean found = false; |
| for (int i = 0; i < elements.length; i++) { |
| Object[] objects = elements[i].getAllObjects(); |
| for (int j = 0; j < objects.length; j++) { |
| if (objects[j] instanceof TclProc) { |
| found = true; |
| break; |
| } |
| } |
| } |
| if (!found) { |
| reporter.report(ICheckKinds.CHECK_UNDEFINED_PROC, |
| "Call to undefined proc:" + realName, null, |
| name.getStart(), name.getEnd(), |
| ITclErrorReporter.WARNING); |
| } |
| return true; |
| |
| // // Skip commands with definitions. They are found. |
| // String name = command.getQualifiedName(); |
| // // Search all methods test |
| // try { |
| // SearchPattern createPattern = SearchPattern.createPattern( |
| // name, IDLTKSearchConstants.METHOD, |
| // IDLTKSearchConstants.DECLARATIONS, |
| // SearchPattern.R_PATTERN_MATCH |
| // | SearchPattern.R_EXACT_MATCH |
| // | SearchPattern.R_CASE_SENSITIVE, |
| // TclLanguageToolkit.getDefault()); |
| // SearchParticipant[] participants = new SearchParticipant[] { |
| // SearchEngine |
| // .getDefaultSearchParticipant() }; |
| // List sourceOnly = new SearchEngine().searchSourceOnly( |
| // createPattern, participants, SearchEngine |
| // .createWorkspaceScope(TclLanguageToolkit |
| // .getDefault()), |
| // new NullProgressMonitor()); |
| // if (sourceOnly == null || sourceOnly.size() == 0) { |
| // reporter.report(ICheckKinds.CHECK_UNDEFINED_PROC, |
| // "Call to undefined proc:" + name, command |
| // .getName().getStart(), command |
| // .getName().getEnd(), |
| // ITclErrorReporter.WARNING); |
| // } |
| // } catch (CoreException e) { |
| // e.printStackTrace(); |
| // } |
| // return true; |
| } |
| }); |
| } |
| } |