package org.eclipse.dltk.ruby.internal.parsers.jruby; /***** BEGIN LICENSE BLOCK ***** * Version: CPL 1.0/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Common Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.eclipse.org/legal/cpl-v10.html * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the CPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the CPL, the GPL or the LGPL. ***** END LICENSE BLOCK *****/ import java.io.Reader; import java.io.StringReader; import org.eclipse.dltk.compiler.problem.IProblemReporter; import org.jruby.ast.Node; import org.jruby.lexer.yacc.ISourcePosition; import org.jruby.lexer.yacc.LexerSource; import org.jruby.lexer.yacc.SyntaxException; import org.jruby.parser.DefaultRubyParser; import org.jruby.parser.RubyParserConfiguration; import org.jruby.parser.RubyParserPool; import org.jruby.parser.RubyParserResult; /** * Serves as a simple facade for all the parsing magic. */ public class DLTKRubyParser { private boolean success; private RubyParserResult result = null; public DLTKRubyParser() { } public RubyParserResult getParserResult() { return result; } public Node parse(String file, String content, IProblemReporter problemReporter) { return parse(file, new StringReader(content), problemReporter); } public Node parse(String file, Reader content, IProblemReporter problemReporter) { RubyParserConfiguration configuration = new RubyParserConfiguration(); DefaultRubyParser parser = null; success = false; IDLTKRubyWarnings warnings; if (problemReporter == null) warnings = new DLTKRubyNullWarnings(); else warnings = new DLTKRubyWarnings(problemReporter); try { parser = RubyParserPool.getInstance().borrowParser(); parser.setWarnings(warnings); LexerSource lexerSource = LexerSource.getSource(file, content); result = parser.parse(configuration, lexerSource); if (result.isEndSeen()) { result.setEndSeen(false); } success = true; } catch (SyntaxException e) { // StringBuffer buffer = new StringBuffer(100); // buffer.append(e.getPosition().getFile()).append(':'); // buffer.append(e.getPosition().getEndLine()).append(": "); // buffer.append(e.getMessage()); ISourcePosition position = e.getPosition(); if( position.getStartOffset() == position.getEndOffset()) { if( position.getStartOffset() > 0 ) { position.adjustStartOffset(-1); } } warnings.error(position, e.getMessage()); } finally { RubyParserPool.getInstance().returnParser(parser); } if (result != null) { result.addAppendBeginNodes(); return result.getAST(); } return null; } public boolean isSuccess() { return success; } }