All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fife.rsta.ac.perl.PerlLanguageSupport Maven / Gradle / Ivy

/*
 * 03/21/2010
 *
 * Copyright (C) 2010 Robert Futrell
 * robert_futrell at users.sourceforge.net
 * http://fifesoft.com/rsyntaxtextarea
 *
 * This library is distributed under a modified BSD license.  See the included
 * RSTALanguageSupport.License.txt file for details.
 */
package org.fife.rsta.ac.perl;

import java.io.File;
import javax.swing.ListCellRenderer;

import org.fife.rsta.ac.AbstractLanguageSupport;
import org.fife.rsta.ac.IOUtil;
import org.fife.rsta.ac.perl.PerlCompletionProvider;
import org.fife.ui.autocomplete.AutoCompletion;
import org.fife.ui.autocomplete.CompletionCellRenderer;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;


/**
 * Language support for Perl.
 *
 * @author Robert Futrell
 * @version 1.0
 */
public class PerlLanguageSupport extends AbstractLanguageSupport {

	/**
	 * The completion provider.  This is shared amongst all Perl text areas.
	 */
	private PerlCompletionProvider provider;

	/**
	 * The parser.  This is shared amongst all Perl text areas.
	 */
	private PerlParser parser;

	/**
	 * The Perl install location currently being used.
	 */
	private static File perlInstallLoc;

	/**
	 * The root directory of the default Perl install.
	 */
	private static File DEFAULT_PERL_INSTALL_LOC;

	/**
	 * Whether parens should be used around arguments to functions.
	 */
	private static boolean useParensWithFunctions;

	/**
	 * Whether to use the system "perldoc" command for function descriptions.
	 * This parameter is ignored if {@link #DEFAULT_PERL_INSTALL_LOC} is
	 * false.
	 */
	private static boolean useSystemPerldoc;


	/**
	 * Determine the Perl install on the user's PATH, if any.
	 */
	static {

		String path = IOUtil.getEnvSafely("PATH");

		if (path!=null) {

			String perlLoc = "perl";
			if (File.separatorChar=='\\') {
				perlLoc += ".exe";
			}

			String[] dirs = path.split(File.pathSeparator);
			for (int i=0; i createDefaultCompletionCellRenderer() {
		CompletionCellRenderer ccr = new CompletionCellRenderer();
		ccr.setShowTypes(false);
		return ccr;
	}


	/**
	 * Returns the location of the first Perl install located on the user's
	 * PATH.
	 *
	 * @return The "default" location at which Perl is installed.
	 * @see #getPerlInstallLocation()
	 */
	public static File getDefaultPerlInstallLocation() {
		return DEFAULT_PERL_INSTALL_LOC;
	}


	/**
	 * Returns the Perl install that is being used for syntax checking.
	 *
	 * @return The location at which Perl is installed, or null
	 *         if none is currently selected.
	 * @see #setPerlInstallLocation(File)
	 */
	public static File getPerlInstallLocation() {
		return perlInstallLoc;
	}


	/**
	 * Returns the shared parser, lazily creating it if necessary.
	 *
	 * @return The parser.
	 */
	private PerlParser getParser() {
		if (parser==null) {
			parser = new PerlParser();
		}
		return parser;
	}


	/**
	 * Returns the Perl parser running on a text area with this Perl language
	 * support installed.
	 *
	 * @param textArea The text area.
	 * @return The Perl parser.  This will be null if the text
	 *         area does not have this PerlLanguageSupport installed.
	 */
	public PerlParser getParser(RSyntaxTextArea textArea) {
		// Could be a parser for another language.
		Object parser = textArea.getClientProperty(PROPERTY_LANGUAGE_PARSER);
		if (parser instanceof PerlParser) {
			return (PerlParser)parser;
		}
		return null;
	}


	/**
	 * Lazily creates the shared completion provider instance for Perl.
	 *
	 * @return The completion provider.
	 */
	private PerlCompletionProvider getProvider() {
		if (provider==null) {
			provider = new PerlCompletionProvider();
		}
		return provider;
	}


	/**
	 * Returns the value to use for PERL5LIB when parsing Perl
	 * code.
	 *
	 * @return The value, or null to use the system default.
	 * @see #setPerl5LibOverride(String)
	 */
	public String getPerl5LibOverride() {
		return getParser().getPerl5LibOverride();
	}


	/**
	 * Returns whether parens are inserted when auto-completing functions.
	 *
	 * @return Whether parens are inserted.
	 * @see #setUseParensWithFunctions(boolean)
	 */
	public boolean getUseParensWithFunctions() {
		return useParensWithFunctions;
	}


	/**
	 * Returns whether to use the system "perldoc" command when getting
	 * descriptions of Perl functions.  If this is false, then
	 * a built-in snapshot of Perl 5.10 descriptions will be used.  This will
	 * perform better, but may be out of date if your version of Perl is newer.
	 * 

* * Note that this parameter is ignored if {@link #getPerlInstallLocation()} * returns null. * * @return Whether to use the system "perldoc" command. * @see #setUseSystemPerldoc(boolean) */ public static boolean getUseSystemPerldoc() { return useSystemPerldoc; } /** * Returns whether warnings are enabled when checking syntax. * * @return Whether warnings are enabled. * @see #setWarningsEnabled(boolean) */ public boolean getWarningsEnabled() { return getParser().getWarningsEnabled(); } /** * {@inheritDoc} */ @Override public void install(RSyntaxTextArea textArea) { PerlCompletionProvider provider = getProvider(); AutoCompletion ac = createAutoCompletion(provider); ac.install(textArea); installImpl(textArea, ac); textArea.setToolTipSupplier(provider); PerlParser parser = getParser(); textArea.addParser(parser); textArea.putClientProperty(PROPERTY_LANGUAGE_PARSER, parser); } /** * Returns whether text areas with this language support installed are * parsed for syntax errors.

* * Note that if {@link #getPerlInstallLocation()} * returns null or an invalid value, parsing will not occur * even if this value is true. * * @return Whether parsing is enabled. * @see #setParsingEnabled(boolean) */ public boolean isParsingEnabled() { return getParser().isEnabled(); } /** * Returns whether taint mode is enabled when checking syntax. * * @return Whether taint mode is enabled. * @see #setTaintModeEnabled(boolean) */ public boolean isTaintModeEnabled() { return getParser().isTaintModeEnabled(); } /** * Toggles whether text areas with this language support installed are * parsed for syntax errors. * * @param enabled Whether parsing should be enabled. * @see #isParsingEnabled() */ public void setParsingEnabled(boolean enabled) { getParser().setEnabled(enabled); } /** * Sets the value to use for PERL5LIB when parsing Perl * code. * * @param override The value, or null to use the system * default. * @see #getPerl5LibOverride() */ public void setPerl5LibOverride(String override) { getParser().setPerl5LibOverride(override); } /** * Sets the Perl install to use for syntax checking, perldoc, etc. * * @param loc The root directory of the Perl installation, or * null for none. * @see #getPerlInstallLocation() */ public static void setPerlInstallLocation(File loc) { perlInstallLoc = loc; } /** * Toggles whether taint mode is enabled when checking syntax. * * @param enabled Whether taint mode should be enabled. * @see #isTaintModeEnabled() */ public void setTaintModeEnabled(boolean enabled) { getParser().setTaintModeEnabled(enabled); } /** * Toggles whether warnings are returned when checking syntax. * * @param enabled Whether warnings are enabled. * @see #getWarningsEnabled() */ public void setWarningsEnabled(boolean enabled) { getParser().setWarningsEnabled(enabled); } /** * Toggles whether parens are inserted when auto-completing functions. * * @param use Whether parens are inserted. * @see #getUseParensWithFunctions() */ public void setUseParensWithFunctions(boolean use) { if (use!=useParensWithFunctions) { useParensWithFunctions = use; if (provider!=null) { provider.setUseParensWithFunctions(use); } } } /** * Sets whether to use the system "perldoc" command when getting * descriptions of Perl functions. If this is false, then * a built-in snapshot of Perl 5.10 descriptions will be used. This will * perform better, but may be out of date if your version of Perl is newer. *

* * Note that this parameter is ignored if {@link #getPerlInstallLocation()} * returns null. * * @param use Whether to use the system "perldoc" command. * @see #getUseSystemPerldoc() */ public static void setUseSystemPerldoc(boolean use) { useSystemPerldoc = use; } /** * {@inheritDoc} */ @Override public void uninstall(RSyntaxTextArea textArea) { uninstallImpl(textArea); PerlParser parser = getParser(textArea); if (parser!=null) { textArea.removeParser(parser); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy