initial checkin
authorfm
Thu, 17 Sep 2009 16:16:31 +0200
changeset 11964 ed7b8114d08a
parent 11963 0419e28049e4
child 11965 5e3ee4d6af23
initial checkin
ProgrammingLanguage.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProgrammingLanguage.st	Thu Sep 17 16:16:31 2009 +0200
@@ -0,0 +1,339 @@
+"{ Package: 'stx:libbasic' }"
+
+Object subclass:#ProgrammingLanguage
+	instanceVariableNames:''
+	classVariableNames:'LanguageQuerySignal'
+	poolDictionaries:''
+	category:'Kernel-Languages'
+!
+
+ProgrammingLanguage class instanceVariableNames:'Instance'
+
+"
+ No other class instance variables are inherited by this class.
+"
+!
+
+!ProgrammingLanguage class methodsFor:'documentation'!
+
+versionSVN
+    ^'$Id: ProgrammingLanguage.st,v 1.1 2009-09-17 14:16:31 fm Exp $'
+! !
+
+!ProgrammingLanguage class methodsFor:'initialization'!
+
+initialize
+
+     LanguageQuerySignal := 
+            QuerySignal new
+                nameClass:self message:#languageQuerySignal;
+                notifierString:'asking for current language';
+                handlerBlock:[:ex | ex proceedWith:SmalltalkLanguage instance].
+
+    "Created: / 12-08-2009 / 14:56:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 16-08-2009 / 10:36:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage class methodsFor:'instance creation'!
+
+forFile: aFilename 
+    "
+     Answers a language for given source file. If none is found,
+     SmalltalkLanguage is returned (to provide backward compatibility)"
+    
+    ^ self instancesDetect: [:each | each canReadSourceFile: aFilename ]
+        ifNone: [ SmalltalkLanguage instance ]
+
+    "Created: / 16-08-2009 / 10:08:44 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+forStream: aStream 
+    "
+     Answers a language for given source stream. If none is found,
+     SmalltalkLanguage is returned (to provide backward compatibility)"
+    
+    aStream isFileStream ifFalse: [ ^ SmalltalkLanguage instance ].
+    ^ self forFile: aStream fileName
+
+    "Created: / 16-08-2009 / 10:56:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+named: aString 
+    ^ self 
+        instancesDetect:[:each | each name = aString ]
+        ifNone: [ self error: 'No language named ' , aString ].
+
+    "
+        ProgrammingLanguage named: 'Smalltalk'
+
+        ProgrammingLanguage named: 'Ruby'"
+
+    "Created: / 15-08-2009 / 22:40:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 16-08-2009 / 10:58:01 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+named: aString ifNone: aBlock
+    ^ self 
+        instancesDetect:[:each | each name = aString ]
+        ifNone: aBlock
+
+    "Created: / 21-08-2009 / 13:07:10 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage class methodsFor:'Signal constants'!
+
+languageQuerySignal
+
+    ^LanguageQuerySignal
+
+    "Created: / 12-08-2009 / 14:57:07 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage class methodsFor:'accessing'!
+
+all
+    "
+    Anwers a collection of all available languages
+    "        
+
+    ^self allSubclasses collect:[:each|each instance]
+
+
+    "
+        ProgrammingLanguage all
+    "
+
+    "Created: / 16-08-2009 / 13:43:41 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+current
+
+    "
+        ProgrammingLanguage current
+    "
+
+
+    ^LanguageQuerySignal query
+
+    "Created: / 12-08-2009 / 15:02:59 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+instance
+
+    Instance ifNil:[Instance := self new].
+    ^Instance
+
+    "Created: / 16-08-2009 / 10:36:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage class methodsFor:'enumerating'!
+
+allDo: aBlock
+
+    ^self allSubclassesDo:
+        [:each|aBlock value: each instance]
+
+    "Created: / 16-08-2009 / 14:07:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage class methodsFor:'private'!
+
+instancesDetect: detectBlock ifNone: failBlock
+
+
+    self allSubclasses 
+        do:[:cls|(detectBlock value: cls instance) ifTrue:[^cls instance]].
+    ^failBlock value
+
+    "Created: / 16-08-2009 / 10:57:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage class methodsFor:'testing'!
+
+isAvailable: langName
+
+    self instancesDetect: [:lang|lang name = langName] ifNone: [^false].
+    ^true
+
+    "
+        ProgrammingLanguage isAvailable: 'Smalltalk' 
+        ProgrammingLanguage isAvailable: 'Ruby'  
+        ProgrammingLanguage isAvailable: 'Haskell'   
+    "
+
+    "Created: / 21-08-2009 / 12:56:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage methodsFor:'accessing'!
+
+name
+    "
+     Answers a human-readable name of myself:
+     'Smalltalk' for SmalltalkLanguage,
+     'Ruby' for RubyLanguage...
+    "
+
+    ^ self subclassResponsibility
+
+    "Created: / 15-08-2009 / 22:38:16 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 16-08-2009 / 10:47:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+sourceFileSuffix
+
+    "
+     Answers a default suffix for source files, i.e.
+     'st' for Smalltalk, 'js' for JavaScript or 'rb' for Ruby'
+    "
+
+    ^self subclassResponsibility
+
+    "Created: / 16-08-2009 / 10:42:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage methodsFor:'accessing - classes'!
+
+compilerClass
+    "
+        Answer a class suitable for compiling a source code
+        in 'my' language
+    "
+
+    ^self subclassResponsibility
+
+    "Created: / 21-08-2009 / 13:00:50 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+explainerClass
+
+    "
+        Answers a class used by browser and debugger to
+        show some hints about the code. It is OK to return
+        nil, which means that there is no explainer for given
+        language.
+    "
+
+    "return nil by default"
+    ^nil
+
+    "Created: / 21-08-2009 / 08:49:13 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+parserClass
+    "
+        Answer a class suitable for parsing a source code
+        in 'my' language
+    "
+
+    ^self subclassResponsibility
+
+    "Created: / 21-08-2009 / 13:00:30 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+sourceFileReaderClass
+
+    "
+        Answers a class that can be used for 
+        reading & compiling source files
+    "
+
+    ^self subclassResponsibility
+
+    "Created: / 16-08-2009 / 09:00:23 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+sourceFileWriterClass
+
+    "
+        Answers a class is used for source file
+        writing (i.e. file-out)            
+    "
+
+    ^self subclassResponsibility
+
+    "Created: / 16-08-2009 / 09:40:19 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage methodsFor:'printing & storing'!
+
+storeOn:aStream
+
+    self class == ProgrammingLanguage 
+        ifTrue:
+            [super storeOn:aStream]
+        ifFalse:
+            [aStream 
+                nextPutAll:'ProgrammingLanguage';
+                nextPutAll:' named: ';
+                nextPutAll:self name storeString].
+
+    "
+        ProgrammingLanguage instance storeString  
+
+        SmalltalkLanguage instance storeString 
+    "
+
+    "Created: / 16-08-2009 / 10:52:28 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage methodsFor:'queries'!
+
+canReadSourceFile: aFilename
+    "
+    Answers true iff file contains source code
+    in 'my' language        
+    "
+
+    "Trivial implementation here, to be overriden by
+     subclasses"
+
+    ^aFilename suffix = self sourceFileSuffix
+
+    "Created: / 16-08-2009 / 10:10:33 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage methodsFor:'testing'!
+
+isSmalltalk
+
+    ^false
+
+    "Created: / 16-08-2009 / 09:01:27 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage methodsFor:'utilities - file in/file out'!
+
+fileIn: aFilename
+
+    ^self sourceFileReaderClass fileIn: aFilename
+
+    "Created: / 16-08-2009 / 13:28:17 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+fileInStream: aStream
+
+    ^self sourceFileReaderClass fileInStream: aStream
+
+    "Created: / 16-08-2009 / 11:05:46 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage methodsFor:'utilities - source code'!
+
+writeComment: aStringOrStringCollection on: aStream 
+    "
+        Utility method - writes a comment to a stream
+        using proper syntax"
+    
+    ^ self sourceFileWriterClass new fileOutComment: aStringOrStringCollection
+        on: aStream
+
+    "Created: / 21-08-2009 / 09:35:07 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProgrammingLanguage class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic/ProgrammingLanguage.st,v 1.1 2009-09-17 14:16:31 fm Exp $'
+! !
+
+ProgrammingLanguage initialize!