blob: 4f225d3d38de27102770485b918293b3f89fd249 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 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
*
*******************************************************************************/
package org.eclipse.dltk.core.tests.model;
import org.eclipse.dltk.compiler.ISourceElementRequestor;
import org.eclipse.dltk.compiler.env.IModuleSource;
import org.eclipse.dltk.compiler.problem.IProblemReporter;
import org.eclipse.dltk.core.ISourceElementParser;
public class TestSourceElementParser implements ISourceElementParser {
private static final String PARSEME_HEADER = "# parseme!\n";
private ISourceElementRequestor requestor;
public void parseSourceModule(IModuleSource module) {
String file = module.getSourceContents().replace("\r\n", "\n");
if (file.startsWith(PARSEME_HEADER)) {
parsePseudo(file);
return;
}
requestor.enterModule();
ISourceElementRequestor.TypeInfo ti = new ISourceElementRequestor.TypeInfo();
ti.name = "Class1";
requestor.enterType(ti);
ISourceElementRequestor.MethodInfo mi = new ISourceElementRequestor.MethodInfo();
mi.name = "Method1";
requestor.enterMethod(mi);
requestor.exitMethod(10);
requestor.exitType(10);
mi.name = "Procedure1";
requestor.enterMethod(mi);
requestor.exitMethod(11);
requestor.exitModule(20);
return;
}
/**
* Parses pseudo-model-code File should have \n as the line endings
*
* @param file
*/
private void parsePseudo(String file) {
if (requestor == null)
return;
requestor.enterModule();
String[] lines = file.split("\n");
int currentLineOffset = 0;
for (int i = 0; i < lines.length; i++) {
String line = lines[i];
String[] split = line.split("\\s+");
if (split.length > 0) {
String cmd = split[0];
String arg = (split.length > 1) ? split[1] : null;
if (cmd.equals("enterType")) {
ISourceElementRequestor.TypeInfo ti = new ISourceElementRequestor.TypeInfo();
ti.name = arg;
ti.declarationStart = currentLineOffset;
ti.nameSourceStart = currentLineOffset;
ti.nameSourceEnd = currentLineOffset + line.length();
requestor.enterType(ti);
} else if (cmd.equals("enterMethod")) {
ISourceElementRequestor.MethodInfo mi = new ISourceElementRequestor.MethodInfo();
mi.name = arg;
mi.declarationStart = currentLineOffset;
mi.nameSourceStart = currentLineOffset;
mi.nameSourceEnd = currentLineOffset + line.length();
requestor.enterMethod(mi);
} else if (cmd.equals("exitType")) {
requestor.exitType(currentLineOffset + line.length());
} else if (cmd.equals("exitMethod")) {
requestor.exitMethod(currentLineOffset + line.length());
}
}
currentLineOffset += line.length() + 1;
}
requestor.exitModule(file.length());
}
public void setRequestor(ISourceElementRequestor requestor) {
this.requestor = requestor;
}
public void setReporter(IProblemReporter reporter) {
}
}