ConfigurableFeatures.st
author Jan Vrany <jan.vrany@labware.com>
Tue, 01 Jun 2021 20:19:13 +0100
branchjv
changeset 25424 51bd8a6b196f
parent 18120 e3a375d5f6a8
permissions -rw-r--r--
Cherry-picked `Context` cherry-picked Context.st from a6b6dda4caff: * 4aaf30c174e9: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de> * c67311afcc6c: #OTHER by cg, Claus Gittinger <cg@exept.de> * 883f79e7b2a6: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 716f3fbb09e9: Don't mark contexts with `CATCHMARK`, Jan Vrany <jan.vrany@fit.cvut.cz> * cff24fa817b0: #REFACTORING by stefan, Stefan Vogel <sv@exept.de> * 521f0d837330: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * bf1118f0fcca: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * e587cdd22868: #BUGFIX by cg, Claus Gittinger <cg@exept.de> * fe9f9487a3ed: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de> * d5b781899274: #BUGFIX by cg, Claus Gittinger <cg@exept.de> * 8258751a7465: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 40173e082cbc: Copyright updates, Jan Vrany <jan.vrany@fit.cvut.cz> * 6db5c28207d5: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * 871ea64fd5dc: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 4b544a108e4e: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de> * 9a8d8399e566: #FEATURE by cgexept.de, Claus Gittinger <cg@exept.de> * 170b00be0103: #BUGFIX by stefan, Stefan Vogel <sv@exept.de> * a6c73965eae8: #FEATURE by cg, Claus Gittinger <cg@exept.de> * ce2a0e462ff0: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 46a260a9ca92: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 46cab49167fb: #UI_ENHANCEMENT by exept, Claus Gittinger <cg@exept.de> * 7d52dfd3997d: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de> * c52eeea62763: Fix `Context >> argAndVarNames` in cases when debug info is not available, Jan Vrany <jan.vrany@labware.com> * b5d6963fe4a9: Backed out changeset c52eeea62763, Jan Vrany <jan.vrany@labware.com> * 6fd3896f8703: #FEATURE by exept, Claus Gittinger <cg@exept.de> * b530ee616256: #REFACTORING by cg, Claus Gittinger <cg@exept.de> * ef9b481d7498: #FEATURE by cg, Claus Gittinger <cg@exept.de> * ea663b72bd51: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * 6179572a733c: #FEATURE by exept, Claus Gittinger <cg@exept.de> * 84155b1b6622: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de> * 37d06602d856: *** empty log message ***, Claus Gittinger <cg@exept.de> * f927b9022fea: *** empty log message ***, Claus Gittinger <cg@exept.de> * 427d3be62d97: #UI_ENHANCEMENT by exept, Claus Gittinger <cg@exept.de>

"{ Package: 'stx:libbasic' }"

Object subclass:#ConfigurableFeatures
	instanceVariableNames:''
	classVariableNames:'LoadedFeatures'
	poolDictionaries:''
	category:'System-Support'
!

!ConfigurableFeatures class methodsFor:'documentation'!

documentation
"
    being tired of finding '(Smalltalk at:someClass) notNil' all over the place,
    start to concentrate feature queries to this single class, which might get more
    feature methods via extensions.
    Thus, to correctly ask for a feature being present, use:
        ConfigurableFeature includesFeature:featureName
    or
        ConfigurableFeatures knownFeatures
    to ask for a list of features.

    Caveat: just started; more will be moved to this place as time goes by
"
! !

!ConfigurableFeatures class methodsFor:'initialization'!

initialize
    "Invoked at system start or when the class is dynamically loaded."

    "/ please change as required (and remove this comment)

    LoadedFeatures := Dictionary new

    "Modified: / 01-12-2014 / 11:16:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ConfigurableFeatures class methodsFor:'queries'!

allFeatures
    "a list of features which are present in that smalltalk configuration"

    ^ self knownFeatures select:[:each | self includesFeature:each]

    "
     ConfigurableFeatures allFeatures 
    "

    "Created: / 07-09-2011 / 10:50:31 / cg"
!

includesFeature:featureName
    |querySelector|

    querySelector := ('has',featureName asUppercaseFirst) asSymbol.
    ^ self perform:querySelector ifNotUnderstood:false.

    "
     ConfigurableFeatures includesFeature:#SubversionSupport
    "

    "Created: / 07-09-2011 / 10:49:08 / cg"
!

knownFeatures
    "a list of known features; some of them might not be present in that smalltalk configuration"

    ^ self class methodDictionary keys
        collect:[:each | 
            (each startsWith:'has') ifTrue:[
                (each endsWith:':') ifFalse:[
                    each copyFrom:4
                ]
            ] ifFalse:[
                nil
            ].
        ]
        thenSelect:[:nm | nm notNil]

    "
     ConfigurableFeatures allFeatures
    "

    "Created: / 07-09-2011 / 10:51:26 / cg"
! !

!ConfigurableFeatures class methodsFor:'queries-features'!

hasCVSSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'CVSSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasCVSSupport
    "

    "Created: / 03-01-2012 / 15:36:54 / cg"
!

hasCVSSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'CVSSourceCodeManager'

    "Created: / 03-01-2012 / 15:42:16 / cg"
!

hasDataBaseSourceCodeManagerSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'DataBaseSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasDataBaseSourceCodeManagerSupport
    "

    "Created: / 03-01-2012 / 15:36:03 / cg"
!

hasDataBaseSourceCodeManagerSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'DataBaseSourceCodeManager'

    "Created: / 03-01-2012 / 15:36:12 / cg"
!

hasExternalLookupSupport
    "Return true, if the VM is compiled with external lookup MOP"
%{
#ifdef SUPPORT_EXTERNAL_LOOKUP
    RETURN ( true );
#endif
%}.
    ^false

    "
        ConfigurableFeatures hasExternalLookupSupport
        ConfigurableFeatures includesFeature:#ExternalLookupSupport
    "

    "Created: / 16-04-2012 / 20:00:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

hasFileBasedSourceCodeManagerSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'FileBasedSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasFileBasedSourceCodeManagerSupport
    "

    "Created: / 21-12-2011 / 17:07:21 / cg"
!

hasFileBasedSourceCodeManagerSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'FileBasedSourceCodeManager'

    "Created: / 21-12-2011 / 17:07:08 / cg"
!

hasGitSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'GitSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasGitSupport
    "

    "Created: / 23-07-2012 / 13:37:09 / cg"
!

hasGitSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'GitSourceCodeManager'

    "
     self hasGitSupportEnabled
    "

    "Created: / 23-07-2012 / 13:37:17 / cg"
!

hasMercurialSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'MercurialSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasMercurialSupport
    "

    "Created: / 18-01-2012 / 10:58:07 / cg"
!

hasMercurialSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'MercurialSourceCodeManager'

    "
     self hasMercurialSupportEnabled
    "

    "Created: / 18-01-2012 / 10:58:12 / cg"
!

hasMonticelloSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'MonticelloSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasMonticelloSupport
    "

    "Created: / 03-01-2012 / 15:44:32 / cg"
!

hasMonticelloSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'MonticelloSourceCodeManager'

    "Created: / 03-01-2012 / 15:44:39 / cg"
!

hasPerforceSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'PerforceSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasPerforceSupport
    "

    "Created: / 03-01-2012 / 15:43:42 / cg"
!

hasPerforceSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'PerforceSourceCodeManager'

    "Created: / 03-01-2012 / 15:43:28 / cg"
!

hasRefactoryBrowser
    "Return true, if refactory browser support is available"

    (LoadedFeatures includesKey: #RefactoryBrowser) ifFalse:[ 
        "/ Called for the very first time

        #(
            #'stx:goodies/refactoryBrowser/browser'
            #'stx:goodies/refactoryBrowser/changes'
            #'stx:goodies/refactoryBrowser/helpers'
            #'stx:goodies/refactoryBrowser/lint'
            #'stx:goodies/refactoryBrowser/parser'
            #'stx:goodies/refactoryBrowser/refactoring'
        ) do:[:each | 
            (ProjectDefinition definitionClassForPackage: each) isNil ifTrue:[
                | loaded |

                loaded := [ Smalltalk loadPackage: each ] on: PackageLoadError do:[ false ].
                loaded ifFalse:[ 
                    LoadedFeatures at: #RefactoryBrowser put: false.
                    ^ false.
                ].
            ]
        ].
        LoadedFeatures at: #RefactoryBrowser put: true.
        ^ true
    ].
    ^ LoadedFeatures includesKey: #RefactoryBrowser

    "
    ConfigurableFeatures includesFeature: #RefactoryBrowser    
    "

    "Created: / 01-12-2014 / 11:16:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

hasSCMSupportEnabledFor:aSourceCodeManagerClassName
    |scm|

    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    scm := Smalltalk at:aSourceCodeManagerClassName ifAbsent:nil.

    ^ scm notNil
        and:[ scm isLoaded 
        and:[ scm shownInBrowserMenus ]]

    "Created: / 18-01-2012 / 10:55:58 / cg"
!

hasSubversionSupport
    "/ use Smalltalk-at to trick the dependency/prerequisite generator
    ^ (Smalltalk at: #'SVNSourceCodeManager' ifAbsent:nil) notNil

    "
     ConfigurableFeatures hasSubversionSupport
    "

    "Created: / 07-09-2011 / 10:40:40 / cg"
    "Modified: / 13-03-2012 / 17:19:13 / Jan Vrany <jan.vrany.fit.cvut.cz>"
!

hasSubversionSupportEnabled
    ^ self hasSCMSupportEnabledFor:#'SVNSourceCodeManager'

    "Created: / 07-09-2011 / 10:41:33 / cg"
! !

!ConfigurableFeatures class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libbasic/ConfigurableFeatures.st,v 1.11 2014-12-01 11:24:54 vrany Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/libbasic/ConfigurableFeatures.st,v 1.11 2014-12-01 11:24:54 vrany Exp $'
! !


ConfigurableFeatures initialize!