blob: 8d4573848ab77224b695d7fd84f5071e4390c032 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 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 (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.tcl.parser.structure;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.dltk.compiler.ISourceElementRequestorExtension;
import org.eclipse.dltk.compiler.SourceElementRequestorAdaptor;
import org.eclipse.dltk.compiler.SourceElementRequestorMode;
import org.eclipse.dltk.core.caching.StructureModelCollector;
public class Collector extends StructureModelCollector
implements ISourceElementRequestorExtension {
/**
* @param requestor
*/
public Collector() {
super(new SourceElementRequestorAdaptor());
}
static class Tag {
final int tag;
final int offset;
String context;
public Tag(int tag, int offset) {
this.tag = tag;
this.offset = offset;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Tag) {
final Tag other = (Tag) obj;
return tag == other.tag && offset == other.offset;
}
return false;
}
@Override
public String toString() {
return tag + "@" + offset + (context != null ? "=" + context : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
final List<Tag> tags = new ArrayList<>();
@Override
protected void writeTag(int tag) throws IOException {
tags.add(new Tag(tag, out.size()));
super.writeTag(tag);
}
@Override
public byte[] getBytes() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
saveDataTo(stream);
} catch (IOException e) {
// should not happen
}
return stream.toByteArray();
}
@Override
public boolean enterFieldCheckDuplicates(FieldInfo info) {
final boolean result = super.enterFieldCheckDuplicates(info);
getLastTag().context = info.name;
return result;
}
@Override
public void enterMethod(MethodInfo info) {
super.enterMethod(info);
getLastTag().context = info.name;
}
@Override
public void enterMethodRemoveSame(MethodInfo info) {
super.enterMethodRemoveSame(info);
getLastTag().context = info.name;
}
@Override
public void enterType(TypeInfo info) {
super.enterType(info);
getLastTag().context = info.name;
}
@Override
public boolean enterTypeAppend(String fullName, String delimiter) {
final boolean result = super.enterTypeAppend(fullName, delimiter);
getLastTag().context = fullName;
return result;
}
/**
* @return
*/
private Tag getLastTag() {
return tags.get(tags.size() - 1);
}
@Override
public void acceptFieldReference(String fieldName, int sourcePosition) {
// ignore
}
@Override
public void acceptMethodReference(String methodName, int argCount,
int sourcePosition, int sourceEndPosition) {
// ignore
}
@Override
public void acceptTypeReference(String typeName, int sourcePosition) {
// ignore
}
@Override
public SourceElementRequestorMode getMode() {
return SourceElementRequestorMode.STRUCTURE;
}
}