/** * 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 java.util.Collections; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import com.aptana.build.util.BuildHelper; import com.aptana.core.build.IProblem; import com.aptana.core.build.RequiredBuildParticipant; import com.aptana.core.resources.IMarkerConstants; import com.aptana.core.util.ArrayUtil; import com.aptana.index.core.build.BuildContext; import com.aptana.parsing.ast.IParseNode; import com.aptana.parsing.ast.IParseRootNode; import com.aptana.ruby.internal.core.RubyComment; /** * Detects task markers in ruby comments. * * @author cwilliams */ public class RubyTaskDetector extends RequiredBuildParticipant { public void buildFile(BuildContext context, IProgressMonitor monitor) { if (context == null) { return; } if(!context.isFullBuild()&&!context.isSave()){ return; } Collection<IProblem> tasks = detectTasks(context, monitor); context.putProblems(IMarkerConstants.TASK_MARKER, tasks); } public void deleteFile(BuildContext context, IProgressMonitor monitor) { if (context == null) { return; } context.removeProblems(IMarkerConstants.TASK_MARKER); } private Collection<IProblem> detectTasks(BuildContext context, IProgressMonitor monitor) { IParseRootNode rootNode = null; try { rootNode = context.getAST(); } catch (CoreException e) { // ignores the parser exception } if (rootNode == null) { return Collections.emptyList(); } IParseNode[] comments = rootNode.getCommentNodes(); if (ArrayUtil.isEmpty(comments)) { return Collections.emptyList(); } Collection<IProblem> tasks = new ArrayList<IProblem>(); SubMonitor sub = SubMonitor.convert(monitor, comments.length); try { IDocument source = new Document(context.getContents()); String filePath = context.getURI().toString(); int i = 0; for (IParseNode commentNode : comments) { if(context.isNeedSleep()){ i++; BuildHelper.sleepLoop(BuildHelper.TASK_TYPE, i); } if (commentNode instanceof RubyComment) { tasks.addAll(processCommentNode(filePath, source, 0, commentNode, "=end", context.isNeedSleep())); //$NON-NLS-1$ } sub.worked(1); } } finally { sub.done(); } return tasks; } }