#Signature file v4.1
#Version 1.17

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
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 org.netbeans.modules.javascript2.knockout.index.KnockoutCustomElement
cons public init(java.lang.String,java.lang.String,java.util.Collection<java.lang.String>,java.net.URL,int)
meth public int getOffset()
meth public java.lang.String getFqn()
meth public java.lang.String getName()
meth public java.net.URL getDeclarationFile()
meth public java.util.List<java.lang.String> getParameters()
supr java.lang.Object
hfds fqn,name,offset,parameters,url

CLSS public org.netbeans.modules.javascript2.knockout.index.KnockoutIndex
meth public java.util.Collection<java.lang.String> getCustomElementParameters(java.lang.String)
meth public java.util.Collection<org.netbeans.modules.javascript2.knockout.index.KnockoutCustomElement> getCustomElements(java.lang.String,boolean)
meth public static org.netbeans.modules.javascript2.knockout.index.KnockoutIndex get(org.netbeans.api.project.Project) throws java.io.IOException
supr java.lang.Object
hfds INDEXES,LOGGER,areProjectsOpen,querySupport

CLSS public org.netbeans.modules.javascript2.knockout.index.KnockoutIndexer
cons public init()
fld public final static java.lang.String CUSTOM_ELEMENT = "ce"
innr public final static Factory
meth protected void index(org.netbeans.modules.parsing.spi.indexing.Indexable,org.netbeans.modules.parsing.spi.Parser$Result,org.netbeans.modules.parsing.spi.indexing.Context)
meth public static boolean isScannerThread()
meth public static void addCustomElement(java.net.URI,org.netbeans.modules.javascript2.knockout.index.KnockoutCustomElement)
supr org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexer
hfds CUSTOM_ELEMENTS,LOG

CLSS public final static org.netbeans.modules.javascript2.knockout.index.KnockoutIndexer$Factory
 outer org.netbeans.modules.javascript2.knockout.index.KnockoutIndexer
cons public init()
fld public final static int VERSION = 1
fld public final static java.lang.String NAME = "knockoutjs"
meth public boolean scanStarted(org.netbeans.modules.parsing.spi.indexing.Context)
meth public int getIndexVersion()
meth public int getPriority()
meth public java.lang.String getIndexerName()
meth public org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexer createIndexer(org.netbeans.modules.parsing.spi.indexing.Indexable,org.netbeans.modules.parsing.api.Snapshot)
meth public static boolean isScannerThread()
meth public static void addPostScanTask(java.lang.Runnable)
meth public void filesDeleted(java.lang.Iterable<? extends org.netbeans.modules.parsing.spi.indexing.Indexable>,org.netbeans.modules.parsing.spi.indexing.Context)
meth public void filesDirty(java.lang.Iterable<? extends org.netbeans.modules.parsing.spi.indexing.Indexable>,org.netbeans.modules.parsing.spi.indexing.Context)
meth public void scanFinished(org.netbeans.modules.parsing.spi.indexing.Context)
supr org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory
hfds PRIORITY,postScanTasks

CLSS public abstract org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexer
cons public init()
meth protected abstract void index(org.netbeans.modules.parsing.spi.indexing.Indexable,org.netbeans.modules.parsing.spi.Parser$Result,org.netbeans.modules.parsing.spi.indexing.Context)
supr java.lang.Object

CLSS public abstract org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory
cons public init()
meth public abstract org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexer createIndexer(org.netbeans.modules.parsing.spi.indexing.Indexable,org.netbeans.modules.parsing.api.Snapshot)
supr org.netbeans.modules.parsing.spi.indexing.SourceIndexerFactory

CLSS public abstract org.netbeans.modules.parsing.spi.indexing.SourceIndexerFactory
cons public init()
meth public abstract int getIndexVersion()
meth public abstract java.lang.String getIndexerName()
meth public abstract void filesDeleted(java.lang.Iterable<? extends org.netbeans.modules.parsing.spi.indexing.Indexable>,org.netbeans.modules.parsing.spi.indexing.Context)
meth public abstract void filesDirty(java.lang.Iterable<? extends org.netbeans.modules.parsing.spi.indexing.Indexable>,org.netbeans.modules.parsing.spi.indexing.Context)
meth public boolean scanStarted(org.netbeans.modules.parsing.spi.indexing.Context)
meth public int getPriority()
meth public void rootsRemoved(java.lang.Iterable<? extends java.net.URL>)
meth public void scanFinished(org.netbeans.modules.parsing.spi.indexing.Context)
supr java.lang.Object

