package org.jetbrains.plugins.ruby.ruby.run.configuration; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.configurations.RunnerSettings; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.ruby.PluginResourceUtil; import org.jetbrains.plugins.ruby.gem.GemInfo; import org.jetbrains.plugins.ruby.gem.util.GemSearchUtil; import org.jetbrains.plugins.ruby.ruby.RubyUtil; import java.util.Map; import java.util.Objects; import java.util.stream.Stream; public class CollectTypeRunConfigurationExtension extends RubyRunConfigurationExtension { @NonNls @NotNull private static final String ID = "CollectTypeRunConfigurationExtension"; @Override protected void readExternal(@NotNull final AbstractRubyRunConfiguration runConfiguration, @NotNull final Element element) throws InvalidDataException { } @Nullable @Override protected String getEditorTitle() { return null; } @Override protected boolean isApplicableFor(@NotNull final AbstractRubyRunConfiguration configuration) { return true; } @Override protected boolean isEnabledFor(@NotNull final AbstractRubyRunConfiguration applicableConfiguration, @Nullable final RunnerSettings runnerSettings) { final CollectTypeExecSettings config = CollectTypeExecSettings.getFrom(applicableConfiguration); return config.isCollectTypeExecEnabled; } @Override protected void patchCommandLine(@NotNull final AbstractRubyRunConfiguration configuration, @Nullable final RunnerSettings runnerSettings, @NotNull final GeneralCommandLine cmdLine, @NotNull final String runnerId) throws ExecutionException { final String typeTrackerPath = PluginResourceUtil.getPluginResourcesPath() + "type_tracker.rb"; final Module module = configuration.getModule(); if (module == null) { return; } final String includeOptions = Stream.of("sqlite3", "arg_scanner") .map(gem -> getRequireKeyForGem(module, gem)) .filter(Objects::nonNull) .reduce(String::concat) .orElseGet(String::new); final Map<String, String> env = cmdLine.getEnvironment(); final String rubyOpt = StringUtil.notNullize(env.get(RubyUtil.RUBYOPT)); final String newRubyOpt = rubyOpt + includeOptions + " -r" + typeTrackerPath; //final String newRubyOpt = rubyOpt + " -r" + typeTrackerScriptURL.getPath(); cmdLine.withEnvironment(RubyUtil.RUBYOPT, newRubyOpt); } @Nullable private String getRequireKeyForGem(@NotNull Module module, @NotNull String gemName) { final GemInfo gemInfo = GemSearchUtil.findGem(module, gemName); if (gemInfo == null) { return null; } final VirtualFile libFolder = gemInfo.getLibFolder(); if (libFolder == null) { return null; } return " -I" + libFolder.getPath(); } @Nullable @Override protected <P extends AbstractRubyRunConfiguration> SettingsEditor<P> createEditor(@NotNull final P configuration) { return null; } }