stx_goodies_smallsense.st
changeset 249 8bc64027b189
parent 234 97857872ee47
child 252 feba6ee5c814
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx_goodies_smallsense.st	Wed Jul 09 12:06:40 2014 +0100
@@ -0,0 +1,417 @@
+"{ Package: 'stx:goodies/smallsense' }"
+
+LibraryDefinition subclass:#stx_goodies_smallsense
+	instanceVariableNames:''
+	classVariableNames:'Swizzled'
+	poolDictionaries:''
+	category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_smallsense class methodsFor:'initialization'!
+
+initialize
+
+    "This should be logically done in postload, but postload
+     is not called when classlibrary is built-in (i.e., not loaded
+     by Smalltalk loadPackage: ...). This is indeed a bug. "
+
+    Swizzled := false.
+    self hasAllExtensionsLoaded ifTrue:[
+        self swizzle
+    ].
+
+    "Created: / 19-08-2013 / 15:24:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-09-2013 / 12:29:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_smallsense class methodsFor:'accessing - tests'!
+
+excludedFromTestSuite
+    "List of testcases and/or tests excluded from testsuite.
+     Entries maybe ClassName or #(ClassName testName)
+    "
+    ^ #(
+        #'SmallSense::BaseTestClass'
+        #'SmallSense::TestCase'
+        #'SmallSense::FinderTests'
+        #'SmallSense::RecognizerTests'
+        #'SmallSense::SmalltalkParserTests'
+    )
+
+    "Created: / 23-05-2014 / 12:49:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_smallsense class methodsFor:'description'!
+
+excludedFromPreRequisites
+    "list all packages which should be ignored in the automatic
+     preRequisites scan. See #preRequisites for more."
+
+    ^ #(
+    )
+!
+
+mandatoryPreRequisites
+    "list packages which are mandatory as a prerequisite.
+     This are packages containing superclasses of my classes and classes which
+     are extended by myself.
+     They are mandatory, beacuse we need these packages as a prerequisite for loading and compiling.
+     This method is generated automatically,
+     by searching along the inheritance chain of all of my classes."
+
+    ^ #(
+        #'stx:goodies/refactoryBrowser/helpers'    "BrowserEnvironment - superclass of SmallSense::SmalltalkUnacceptedMethodEnvironment "
+        #'stx:goodies/refactoryBrowser/lint'    "RBLintRule - extended "
+        #'stx:goodies/regex'    "Regex::RxCharSetParser - superclass of SmallSense::TokenPatternParser::TokenSpecParser "
+        #'stx:goodies/sunit'    "TestAsserter - superclass of SmallSense::AbstractJavaCompletionEngineTests "
+        #'stx:libbasic'    "Collection - extended "
+        #'stx:libcomp'    "AbstractSyntaxHighlighter - superclass of SmallSense::SmalltalkParser "
+        #'stx:libhtml'    "HTMLDocumentFrame - extended "
+        #'stx:libtool'    "AbstractSettingsApplication - superclass of SmallSense::SettingsAppl "
+        #'stx:libview'    "DeviceGraphicsContext - extended "
+        #'stx:libview2'    "ApplicationModel - extended "
+        #'stx:libwidg'    "EditTextView - extended "
+        #'stx:libwidg2'    "DoWhatIMeanSupport - extended "
+    )
+!
+
+referencedPreRequisites
+    "list packages which are a prerequisite, because they contain
+     classes which are referenced by my classes.
+     We do not need these packages as a prerequisite for loading or compiling.
+     This method is generated automatically,
+     by searching all classes (and their packages) which are referenced by my classes."
+
+    ^ #(
+        #'stx:goodies/refactoryBrowser/parser'    "RBFormatter - referenced by SmallSense::SmalltalkEditSupport>>electricInsertSnippetAfterDoubleColon "
+        #'stx:libbasic2'    "BackgroundQueueProcessingJob - referenced by SmallSense::Manager>>initialize "
+        #'stx:libbasic3'    "ChangeSet - referenced by RBTransformationRule>>fixes: "
+        #'stx:libjava'    "Java - referenced by SmallSense::JavaCompletionEngineEnvironmentResource>>tearDown "
+        #'stx:libjava/tools'    "GroovyScanner - referenced by SmallSense::GroovyCompletionEngineSimple>>scannerClass "
+    )
+!
+
+subProjects
+    "list packages which are known as subprojects.
+     The generated makefile will enter those and make there as well.
+     However: they are not forced to be loaded when a package is loaded;
+     for those, redefine requiredPrerequisites"
+
+    ^ #(
+    )
+! !
+
+!stx_goodies_smallsense class methodsFor:'description - actions'!
+
+postLoadAction
+
+    "/ Setup SmallSense completion
+    UserPreferences current at: #searchCompletionBlock put: #SmallSense.     
+
+    "/ Swizzle methods. Note, that if they are already swizzled,
+    "/ self swizzle is noop.
+    self swizzle.
+
+    "Created: / 02-09-2013 / 12:30:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 25-11-2013 / 12:31:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_smallsense class methodsFor:'description - compilation'!
+
+additionalRules_bc_dot_mak
+    "obsolete - kept for compatibility with old project files"
+
+    ^ '
+# HACK to make it compilable under CVS stx:libtool
+$(INCLUDE_TOP)\stx\libtool\Tools__NavigationState.$(H): $(INCLUDE_TOP)\stx\libtool\Tools_NavigationState.$(H)
+        copy $(INCLUDE_TOP)\stx\libtool\Tools_NavigationState.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__NavigationState.$(H)
+'
+
+    "Created: / 04-09-2013 / 08:28:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+additionalRules_make_dot_proto
+    "allows for additional rules to be added to the make.proto file."
+
+    ^ '
+# HACK to make it compilable under CVS stx:libtool
+$(INCLUDE_TOP)/stx/libtool/Tools__NavigationState.$(H): $(INCLUDE_TOP)/stx/libtool/Tools_NavigationState.$(H)
+        ln -s $(INCLUDE_TOP)/stx/libtool/Tools_NavigationState.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__NavigationState.$(H)
+'
+
+    "Created: / 04-09-2013 / 08:02:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_smallsense class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+    "lists the classes which are to be included in the project.
+     Each entry in the list may be: a single class-name (symbol),
+     or an array-literal consisting of class name and attributes.
+     Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+    ^ #(
+        "<className> or (<className> attributes...) in load order"
+        (#'SmallSense::BaseTestClass' autoload)
+        #'SmallSense::CodeHighlightingService'
+        #'SmallSense::CodeNavigationService'
+        #'SmallSense::CompletionContext'
+        #'SmallSense::CompletionController'
+        #'SmallSense::CompletionEngine'
+        (#'SmallSense::CompletionEngineTests' autoload)
+        #'SmallSense::CompletionResult'
+        #'SmallSense::CompletionView'
+        #'SmallSense::CriticsWindow'
+        #'SmallSense::EditService'
+        #'SmallSense::EditSupport'
+        #'SmallSense::Info'
+        (#'SmallSense::JavaCompletionEngineEnvironmentResource' autoload)
+        #'SmallSense::Manager'
+        #'SmallSense::PO'
+        #'SmallSense::ParseTreeIndex'
+        #'SmallSense::ParseTreeIndexEntry'
+        #'SmallSense::ParseTreeInspector'
+        #'SmallSense::SelectorNode'
+        #'SmallSense::SettingsAppl'
+        #'SmallSense::SmalltalkChecker'
+        #'SmallSense::SmalltalkInferencerParameters'
+        #'SmallSense::SmalltalkLintAnnotation'
+        #'SmallSense::SmalltalkLintHighlighter'
+        #'SmallSense::SmalltalkLintService'
+        #'SmallSense::SmalltalkParseNodeVisitor'
+        #'SmallSense::SmalltalkParser'
+        #'SmallSense::SmalltalkQuickFixer'
+        #'SmallSense::SmalltalkSyntaxHighlighter'
+        #'SmallSense::SmalltalkUnacceptedMethodEnvironment'
+        (#'SmallSense::TestCase' autoload)
+        #'SmallSense::TokenPatternMatcher'
+        (#'SmallSense::TokenPatternMatcherTests' autoload)
+        #'SmallSense::TokenPatternParser'
+        #'SmallSense::TokenPatternToken'
+        #'SmallSense::TokenPatternTokenSet'
+        #'SmallSense::TokenStream'
+        #'SmallSense::Type'
+        #'SmallSense::TypeHolder'
+        #'stx_goodies_smallsense'
+        #'SmallSense::AbstractJavaCompletionEngine'
+        (#'SmallSense::AbstractJavaCompletionEngineTests' autoload)
+        #'SmallSense::ClassInfo'
+        #'SmallSense::ClassPO'
+        #'SmallSense::ClassType'
+        #'SmallSense::ConstantPO'
+        (#'SmallSense::FinderTests' autoload)
+        #'SmallSense::GenericEditSupport'
+        #'SmallSense::JavaEditSupport'
+        #'SmallSense::JavaImportPO'
+        #'SmallSense::MethodInfo'
+        #'SmallSense::MethodPO'
+        (#'SmallSense::RecognizerTests' autoload)
+        #'SmallSense::SmalltalkCompletionEngine'
+        #'SmallSense::SmalltalkEditSupport'
+        #'SmallSense::SmalltalkInferencer'
+        #'SmallSense::SmalltalkParseNodeFinder'
+        (#'SmallSense::SmalltalkParserTests' autoload)
+        #'SmallSense::SnippetPO'
+        #'SmallSense::UnionType'
+        #'SmallSense::UnknownType'
+        #'SmallSense::VariablePO'
+        #'SmallSense::AbstractJavaCompletionEngineSimple'
+        (#'SmallSense::GroovyCompletionEngineSimpleTests' autoload)
+        #'SmallSense::GroovyEditSupport'
+        #'SmallSense::JavaCompletionEngine'
+        #'SmallSense::JavaConstructorPO'
+        #'SmallSense::MethodKeywordRestPO'
+        #'SmallSense::JavaCompletionEngineSimple'
+        #'SmallSense::GroovyCompletionEngineSimple'
+    )
+!
+
+extensionMethodNames
+    "list class/selector pairs of extensions.
+     A correponding method with real names must be present in my concrete subclasses"
+
+    ^ #(
+        ParseNode isSelector
+        AssignmentNode childNamesAndValuesDo:
+        AssignmentNode inferedType
+        AssignmentNode inferedType:
+        MessageNode childNamesAndValuesDo:
+        ParseErrorNode childNamesAndValuesDo:
+        ParseNode childNamesAndValuesDo:
+        ParseNode inferedType
+        ParseNode inferedType:
+        PrimaryNode childNamesAndValuesDo:
+        StatementNode childNamesAndValuesDo:
+        StatementNode inferedType
+        StatementNode inferedType:
+        UserPreferences smallSenseEnabled
+        UserPreferences smallSenseEnabled:
+        VariableNode isGlobalOrPrivateClass
+        'ConfigurableFeatures class' hasSmallSenseEnabled
+        UserPreferences smallSenseBackgroundLintEnabled
+        UserPreferences smallSenseBackgroundLintEnabled:
+        RBLintRule fixes:
+        RBTransformationRule fixes:
+        UserPreferences smallSenseBackgroundTypingEnabled
+        UserPreferences smallSenseBackgroundTypingEnabled:
+        HTMLDocumentView doQuickFix:
+        'Tools::CodeHighlightingService class' new
+        DoWhatIMeanSupport smallSenseCodeCompletionForClass:context:codeView:
+        #'Tools::NavigationState' smallSenseSelectedClasses
+        'Tools::CodeCompletionService class' smallSenseIsUsefulFor:
+        BlockNode childNamesAndValuesDo:
+        'Tools::CodeNavigationService class' new
+        'Workspace class' smallSenseCodeCompletionServiceClass
+        ParseNode navigateToUsing:
+        MessageNode navigateToUsing:
+        VariableNode navigateToUsing:
+        EditTextView autoIndent
+        #'Tools::NewSystemBrowser' #'searchCompletionBlock_SmallSense'
+        #'Tools::NewSystemBrowser' smallSenseSearchCompletion:
+        #'Tools::NewSystemBrowser' smallSenseSearchCompletionBlock
+        #'Tools::NewSystemBrowser' smallSenseSearchCompletionEntryForClass:showPrefix:
+        #'Tools::NewSystemBrowser' smallSenseSearchCompletionNewForClass:
+        PrimitiveNode inferedType
+        UserPreferences smallSenseCompleteIfUnambiguous
+        UserPreferences smallSenseCompleteIfUnambiguous:
+        UserPreferences smallSenseCompletionEnabled
+        UserPreferences smallSenseCompletionEnabled:
+        Method inspector2TabParseTreeInspector
+        Method inspector2Tabs
+        ReturnNode childNamesAndValuesDo:
+    )
+! !
+
+!stx_goodies_smallsense class methodsFor:'description - project information'!
+
+applicationIconFileName
+    "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+    ^ nil
+    "/ ^ self applicationName
+!
+
+companyName
+    "Return a companyname which will appear in <lib>.rc"
+
+    ^ 'eXept Software AG'
+!
+
+description
+    "Return a description string which will appear in vc.def / bc.def"
+
+    ^ 'Smalltalk/X Class library'
+!
+
+legalCopyright
+    "Return a copyright string which will appear in <lib>.rc"
+
+    ^ 'Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011'
+!
+
+productName
+    "Return a product name which will appear in <lib>.rc"
+
+    ^ 'Smalltalk/X'
+! !
+
+!stx_goodies_smallsense class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+    "Return a SVN repository URL of myself.
+     (Generated since 2011-04-08)
+    "        
+
+    ^ '$URL: https://vranyj1@swing.fit.cvut.cz/svn/stx/libtool/branches/jv/smallsense/stx_goodies_smallsense.st $'
+!
+
+svnRevisionNr
+    "Return a SVN revision number of myself.
+     This number is updated after a commit"
+
+    ^ "$SVN-Revision:"'7962            '"$"
+! !
+
+!stx_goodies_smallsense class methodsFor:'swizzling'!
+
+swizzle
+    "Swizzle all methods annotated as <swizzle:>"
+
+    Swizzled ifTrue:[ ^ self ].
+    [
+        self extensionMethods do:[:m|self swizzle: m].
+        Swizzled := true.
+    ] on: Error do:[:ex |
+        Logger log: ('Cannot swizzle: %1' bindWith: ex description) severity: #error
+    ].
+
+
+    "
+    stx_goodies_smallsense swizzle
+    "
+
+    "Created: / 19-08-2013 / 14:54:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-09-2013 / 12:30:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+swizzle: method
+    "Swizzle the method if it is annotated by <swizzle:> annotation"
+
+    | annotation |
+
+    [
+        annotation := method annotationAt: #swizzle:.
+        annotation notNil ifTrue:[
+            self swizzle: method as: (annotation argumentAt: 1).
+        ]
+    ] on: Error do:[:ex|
+        Logger log: ('Cannot swizzle %1: %2' bindWith: method with: ex description) severity: #error
+    ]
+
+    "Created: / 19-08-2013 / 14:53:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+swizzle: originalMethod as: selector
+    "Given an extension method, swizzle it into method's class
+     under given selector."
+
+    | cls overwrittenMethod swizzledMethod |
+
+    cls := originalMethod mclass.
+    overwrittenMethod := cls compiledMethodAt: selector.
+    overwrittenMethod isNil ifTrue:[
+        "/ Oops, method gone?
+        self breakPoint: #jv.
+        ^ self.
+    ].
+
+    self assert: originalMethod numArgs == overwrittenMethod numArgs.
+
+    swizzledMethod := originalMethod copy.
+    "/ Now, fake the package and source of swizzled method
+    "/ so on fileout, original code gets filed out.
+    swizzledMethod setPackage: overwrittenMethod package.
+    swizzledMethod setCategory: overwrittenMethod category.
+    swizzledMethod source: overwrittenMethod source.
+
+    "/ Install the swizzled method
+    cls methodDictionary at: selector put: swizzledMethod
+
+    "Created: / 19-08-2013 / 14:01:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-08-2013 / 15:03:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_smallsense class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id: stx_goodies_smallsense.st,v 1.2 2014/02/12 14:49:29 sr Exp $'
+! !
+
+
+stx_goodies_smallsense initialize!