/*=============================================================================#
# Copyright (c) 2015-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.statet.r.internal.ui;
import java.util.List;
import de.walware.ecommons.ltk.core.model.IModelElement;
import de.walware.statet.r.core.model.IRFrame;
import de.walware.statet.r.core.model.IRMethod;
import de.walware.statet.r.core.model.RElementName;
import de.walware.statet.r.core.model.RModel;
import de.walware.statet.r.ui.sourceediting.RFrameSearchPath;
import de.walware.statet.r.ui.sourceediting.RFrameSearchPath.RFrameIterator;
public class FCallNamePattern {
private final RElementName elementName;
private final String packageName;
private final String assignName;
private final int assignLength;
public FCallNamePattern(final RElementName name) {
this.elementName= name;
this.packageName= (name.getScope() != null
&& RElementName.isPackageFacetScopeType(name.getScope().getType()) ) ?
name.getScope().getSegmentName() : null;
if (this.elementName.getNextSegment() == null) {
this.assignName= this.elementName.getSegmentName();
this.assignLength= this.assignName.length();
}
else {
this.assignName= null;
this.assignLength= 0;
}
}
public final RElementName getElementName() {
return this.elementName;
}
public boolean matches(final RElementName candidateName) {
String candidate0;
return (candidateName != null
&& (this.elementName.equals(candidateName)
|| (this.assignName != null && candidateName.getNextSegment() == null
&& this.assignLength == (candidate0= candidateName.getSegmentName()).length() - 2
&& this.elementName.getType() == candidateName.getType()
&& candidate0.charAt(this.assignLength) == '<' && candidate0.charAt(this.assignLength + 1) == '-'
&& candidate0.regionMatches(false, 0, this.assignName, 0, this.assignLength) )));
}
public void searchFDef(final RFrameSearchPath searchPath) {
ITER_FRAMES: for (final RFrameIterator iter= searchPath.iterator(); iter.hasNext(); ) {
final IRFrame frame= iter.next();
if (this.packageName != null) {
final RElementName frameName= frame.getElementName();
if (!(frameName != null
&& RElementName.isPackageFacetScopeType(frameName.getType())
&& packageName.equals(frameName.getSegmentName()) )) {
continue ITER_FRAMES;
}
}
final List<? extends IModelElement> elements= frame.getModelChildren(null);
for (final IModelElement candidate : elements) {
if (candidate.getModelTypeId() == RModel.R_TYPE_ID
&& (candidate.getElementType() & IModelElement.MASK_C1) == IModelElement.C1_METHOD
&& matches((RElementName) candidate.getElementName()) ) {
handleMatch((IRMethod) candidate, frame, iter);
}
}
}
}
protected void handleMatch(final IRMethod element, final IRFrame frame,
final RFrameIterator iterator) {
}
}