/** * Aptana Studio * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.ruby.internal.core.build; import java.util.ArrayList; import java.util.Collection; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.jrubyparser.CompatVersion; import com.aptana.core.build.IProblem; import com.aptana.core.build.IProblem.Severity; import com.aptana.core.build.Problem; import com.aptana.core.build.RequiredBuildParticipant; import com.aptana.index.core.build.BuildContext; import com.aptana.parsing.ast.IParseError; import com.aptana.ruby.core.RubyParseState; import com.aptana.ruby.launching.RubyLaunchingPlugin; /** * Parses the file with the correct ruby parser given the project setup. Marks syntax errors/warnings. * * @author cwilliams */ public class RubyValidator extends RequiredBuildParticipant { private CompatVersion version; @Override public void buildStarting(IProject project, int kind, IProgressMonitor monitor) { super.buildStarting(project, kind, monitor); String rubyVersion = RubyLaunchingPlugin.getRubyVersionForProject(project); if (rubyVersion != null && rubyVersion.startsWith("ruby 1.9")) //$NON-NLS-1$ { version = CompatVersion.RUBY1_9; } else if (rubyVersion != null && rubyVersion.startsWith("ruby 1.8")) //$NON-NLS-1$ { version = CompatVersion.RUBY1_8; } else { version = CompatVersion.BOTH; } } @Override public void buildEnding(IProgressMonitor monitor) { version = CompatVersion.BOTH; super.buildEnding(monitor); } public void buildFile(BuildContext context, IProgressMonitor monitor) { if(context==null){ return; } if(!context.isFullBuild()&&!context.isSave()){ return; } String contents = null; String uri = context.getName(); try { contents = context.getContents(); RubyParseState parseState = new RubyParseState(contents, uri, 1, version); uri = context.getURI().toString(); context.getAST(parseState); } catch (CoreException e) { // ignore, just forcing a parse } Collection<IProblem> problems = new ArrayList<IProblem>(); for (IParseError parseError : context.getParseErrors()) { int severity = parseError.getSeverity().getCode(); int line = -1; if (contents != null) { line = getLineNumber(parseError.getOffset(), contents); } problems.add(new Problem(severity, parseError.getMessage(), parseError.getOffset(), parseError.getLength(), line, uri)); } context.putProblems(IMarker.PROBLEM, problems); } public void deleteFile(BuildContext context, IProgressMonitor monitor) { context.removeProblems(IMarker.PROBLEM); } }