#Signature file v4.1
#Version 2.176

CLSS public abstract interface java.beans.PropertyChangeListener
intf java.util.EventListener
meth public abstract void propertyChange(java.beans.PropertyChangeEvent)

CLSS public abstract interface java.io.Serializable

CLSS public abstract interface java.lang.Comparable<%0 extends java.lang.Object>
meth public abstract int compareTo({java.lang.Comparable%0})

CLSS public abstract java.lang.Enum<%0 extends java.lang.Enum<{java.lang.Enum%0}>>
cons protected init(java.lang.String,int)
innr public final static EnumDesc
intf java.io.Serializable
intf java.lang.Comparable<{java.lang.Enum%0}>
intf java.lang.constant.Constable
meth protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth protected final void finalize()
 anno 0 java.lang.Deprecated(boolean forRemoval=true, java.lang.String since="18")
meth public final boolean equals(java.lang.Object)
meth public final int compareTo({java.lang.Enum%0})
meth public final int hashCode()
meth public final int ordinal()
meth public final java.lang.Class<{java.lang.Enum%0}> getDeclaringClass()
meth public final java.lang.String name()
meth public final java.util.Optional<java.lang.Enum$EnumDesc<{java.lang.Enum%0}>> describeConstable()
meth public java.lang.String toString()
meth public static <%0 extends java.lang.Enum<{%%0}>> {%%0} valueOf(java.lang.Class<{%%0}>,java.lang.String)
supr java.lang.Object

CLSS public java.lang.Object
cons public init()
meth protected java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth protected void finalize() throws java.lang.Throwable
 anno 0 java.lang.Deprecated(boolean forRemoval=true, java.lang.String since="9")
meth public boolean equals(java.lang.Object)
meth public final java.lang.Class<?> getClass()
meth public final void notify()
meth public final void notifyAll()
meth public final void wait() throws java.lang.InterruptedException
meth public final void wait(long) throws java.lang.InterruptedException
meth public final void wait(long,int) throws java.lang.InterruptedException
meth public int hashCode()
meth public java.lang.String toString()

CLSS public abstract interface java.lang.constant.Constable
meth public abstract java.util.Optional<? extends java.lang.constant.ConstantDesc> describeConstable()

CLSS public abstract interface java.util.EventListener

CLSS public final org.netbeans.modules.php.project.api.PhpAnnotations
fld public final static java.lang.String PROP_RESOLVE_DEPRECATED_ELEMENTS = "PROP_RESOLVE_DEPRECATED_ELEMENTS"
fld public final static java.lang.String PROP_UNKNOWN_ANNOTATIONS_AS_TYPE_ANNOTATIONS = "PROP_UNKNOWN_ANNOTATIONS_AS_TYPE_ANNOTATIONS"
intf java.beans.PropertyChangeListener
meth public boolean isResolveDeprecatedElements()
meth public boolean isUnknownAnnotationsAsTypeAnnotations()
meth public java.util.List<org.netbeans.modules.php.spi.annotation.AnnotationCompletionTagProvider> getCompletionTagProviders(org.openide.filesystems.FileObject)
meth public static org.netbeans.modules.php.project.api.PhpAnnotations getDefault()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void propertyChange(java.beans.PropertyChangeEvent)
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
supr java.lang.Object
hfds INSTANCE,cache,propertyChangeSupport

CLSS public final org.netbeans.modules.php.project.api.PhpEditorExtender
meth public static org.netbeans.modules.php.spi.editor.EditorExtender forFileObject(org.openide.filesystems.FileObject)
supr java.lang.Object
hfds EMPTY_EDITOR_EXTENDER
hcls EmptyEditorExtender

CLSS public final org.netbeans.modules.php.project.api.PhpLanguageProperties
fld public final static boolean ASP_TAGS_ENABLED
fld public final static boolean SHORT_TAGS_ENABLED = false
fld public final static java.lang.String PROP_ASP_TAGS
fld public final static java.lang.String PROP_PHP_VERSION
fld public final static java.lang.String PROP_SHORT_TAGS
meth public boolean areAspTagsEnabled()
meth public boolean areShortTagsEnabled()
meth public java.lang.String toString()
meth public org.netbeans.modules.php.api.PhpVersion getPhpVersion()
meth public static org.netbeans.modules.php.project.api.PhpLanguageProperties forFileObject(org.openide.filesystems.FileObject)
meth public static org.netbeans.modules.php.project.api.PhpLanguageProperties getDefault()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
supr java.lang.Object
hfds INSTANCE,impl
hcls DefaultOptions,PhpLanguageOptionsImpl,ProjectOptions

CLSS public final org.netbeans.modules.php.project.api.PhpOptions
fld public final static java.lang.String PROP_PHP_DEBUGGER_MAX_CHILDREN = "propPhpDebuggerMaxChildren"
fld public final static java.lang.String PROP_PHP_DEBUGGER_MAX_STRUCTURES_DEPTH = "propPhpDebuggerMaxStructuresDepth"
fld public final static java.lang.String PROP_PHP_DEBUGGER_PORT = "propPhpDebuggerPort"
fld public final static java.lang.String PROP_PHP_DEBUGGER_RESOLVE_BREAKPOINTS = "propPhpDebuggerResolveBreakpoints"
fld public final static java.lang.String PROP_PHP_DEBUGGER_SESSION_ID = "propPhpDebuggerSessionId"
fld public final static java.lang.String PROP_PHP_DEBUGGER_SHOW_CONSOLE = "propPhpDebuggerShowConsole"
fld public final static java.lang.String PROP_PHP_DEBUGGER_SHOW_URLS = "propPhpDebuggerShowUrls"
fld public final static java.lang.String PROP_PHP_DEBUGGER_STOP_AT_FIRST_LINE = "propPhpDebuggerStopAtFirstLine"
fld public final static java.lang.String PROP_PHP_DEBUGGER_WATCHES_AND_EVAL = "propPhpDebuggerWatchesAndEval"
fld public final static java.lang.String PROP_PHP_GLOBAL_INCLUDE_PATH = "propPhpGlobalIncludePath"
fld public final static java.lang.String PROP_PHP_INTERPRETER = "propPhpInterpreter"
meth public boolean isDebuggerResolveBreakpoints()
meth public boolean isDebuggerShowDebuggerConsole()
meth public boolean isDebuggerShowRequestedUrls()
meth public boolean isDebuggerStoppedAtTheFirstLine()
meth public boolean isDebuggerWatchesAndEval()
meth public int getDebuggerMaxChildren()
meth public int getDebuggerMaxDataLength()
meth public int getDebuggerMaxStructuresDepth()
meth public int getDebuggerPort()
meth public java.lang.String getDebuggerSessionId()
meth public java.lang.String getPhpGlobalIncludePath()
meth public java.lang.String getPhpInterpreter()
meth public java.lang.String[] getPhpGlobalIncludePathAsArray()
meth public static org.netbeans.modules.php.project.api.PhpOptions getInstance()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
supr java.lang.Object
hfds INSTANCE,propertyChangeSupport

CLSS public final org.netbeans.modules.php.project.api.PhpProjectUtils
meth public static boolean isPhpProject(org.netbeans.api.project.Project)
supr java.lang.Object

CLSS public abstract interface org.netbeans.modules.php.project.api.PhpSeleniumProvider
meth public abstract boolean isSupportEnabled(org.openide.filesystems.FileObject[])
meth public abstract java.util.List<java.lang.Object> getTestSourceRoots(java.util.Collection<org.netbeans.api.project.SourceGroup>,org.openide.filesystems.FileObject)
meth public abstract org.openide.filesystems.FileObject getTestDirectory(boolean)
meth public abstract void runAllTests()

CLSS public final org.netbeans.modules.php.project.api.PhpSourcePath
fld public final static java.lang.String BOOT_CP = "classpath/php-boot"
fld public final static java.lang.String PROJECT_BOOT_CP = "classpath/php-project-boot"
fld public final static java.lang.String SOURCE_CP = "classpath/php-source"
innr public final static !enum FileType
meth public static java.util.List<org.openide.filesystems.FileObject> getIncludePath(org.openide.filesystems.FileObject)
meth public static java.util.List<org.openide.filesystems.FileObject> getPreindexedFolders()
meth public static org.netbeans.modules.php.project.api.PhpSourcePath$FileType getFileType(org.openide.filesystems.FileObject)
meth public static org.openide.filesystems.FileObject resolveFile(org.openide.filesystems.FileObject,java.lang.String)
supr java.lang.Object
hfds DEFAULT_PHP_SOURCE_PATH,phpStubsFolder
hcls DefaultPhpSourcePath

CLSS public final static !enum org.netbeans.modules.php.project.api.PhpSourcePath$FileType
 outer org.netbeans.modules.php.project.api.PhpSourcePath
fld public final static org.netbeans.modules.php.project.api.PhpSourcePath$FileType INCLUDE
fld public final static org.netbeans.modules.php.project.api.PhpSourcePath$FileType INTERNAL
fld public final static org.netbeans.modules.php.project.api.PhpSourcePath$FileType SOURCE
fld public final static org.netbeans.modules.php.project.api.PhpSourcePath$FileType TEST
fld public final static org.netbeans.modules.php.project.api.PhpSourcePath$FileType UNKNOWN
meth public static org.netbeans.modules.php.project.api.PhpSourcePath$FileType valueOf(java.lang.String)
meth public static org.netbeans.modules.php.project.api.PhpSourcePath$FileType[] values()
supr java.lang.Enum<org.netbeans.modules.php.project.api.PhpSourcePath$FileType>

