/*******************************************************************************
* Copyright (c) 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.corext.dom.fragments;
import org.eclipse.php.core.ast.nodes.ASTNode;
import org.eclipse.php.internal.core.ast.rewrite.ASTRewrite;
import org.eclipse.text.edits.TextEditGroup;
/**
* An IASTFragment represents 'part' of an AST, but not necessarily a subtree of
* the AST. A fragment may simply be an instance of some sort of pattern or
* formation in an AST. Such "fragments", however, do correspond to a contiguous
* source code region, and, thus, posses a source start position, and a source
* length. Every fragment maps to an ASTNode, although this mapping is not
* necessarily straightforward, and more than one fragment may map to a given
* node.
*
* Fragments support abstract operations, which support the notion of 'matching'
* fragments. One operation determines whether a fragment 'matches' a given
* fragment. Another operation finds all sub-fragments (fragments contained
* within a parent fragment, including the parent itself) which 'match' another
* given fragment.
*
*/
public interface IASTFragment {
/**
* Determines whether <code> other </code> 'matches' <code> this </code>.
* This binary operation should be reflexive, symmetric, and transitive.
*
* That two node match does not imply that their source ranges are the same,
* or that they map (via getAssociatedNode()) to the same node.
*/
public boolean matches(IASTFragment other);
/**
* Returns (at least some approximation of) a maximal set of sub-fragments
* of this fragment which match <code> toMatch </code>
*/
public IASTFragment[] getSubFragmentsMatching(IASTFragment toMatch);
/**
* Every fragment maps to a node. Multiple fragments can map to the same
* node.
*
* @return ASTNode The node to which this fragment maps.
*/
public ASTNode getAssociatedNode();
/**
* Every fragment has a source start position.
*
* @return int The source start position.
*/
public int getStartPosition();
/**
* Every fragment has a source length.
*
* @return int The source length.
*/
public int getLength();
/**
* Replaces this fragment with the given replacement node.
*
* @param rewrite
* an ASTRewrite
* @param replacement
* replacement for this fragment
* @param textEditGroup
* a description or <code>null</code>
*/
public void replace(ASTRewrite rewrite, ASTNode replacement, TextEditGroup textEditGroup);
}