help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] [PATCH 15/15] tooling: Introduce a helper for a Montice


From: Holger Hans Peter Freyther
Subject: [Help-smalltalk] [PATCH 15/15] tooling: Introduce a helper for a Monticello export
Date: Mon, 8 Apr 2013 11:30:31 +0200

The category of classes and extensions should match the package
name. Create a small class that is checking this on a package and
print the errors.

2013-03-30  Holger Hans Peter Freyther  <address@hidden>

        * Lint/Monticello.st: Added Monticello class for linting.
        * Parser/EmittedClass.st: Reimplement >>#isEmittedClass, 
>>#methodsToEmit,
                >>#classMethodsToEmit, #>>isComplete.
        * Parser/EmittedEntity.st: Added >>#isEmittedClass.
        * Parser/Loader.st: Add >>#stuffToEmit selector.
        * TODO: Add work item.
        * package.xml: Add the Lint/Monticello.st.
---
 packages/tooling/ChangeLog               |   10 ++
 packages/tooling/Lint/Monticello.st      |  151 ++++++++++++++++++++++++++++++
 packages/tooling/Makefile.frag           |    2 +-
 packages/tooling/Parser/EmittedClass.st  |   20 ++++
 packages/tooling/Parser/EmittedEntity.st |    4 +
 packages/tooling/Parser/Loader.st        |    5 +
 packages/tooling/TODO                    |   11 +++
 packages/tooling/package.xml             |    2 +
 8 files changed, 204 insertions(+), 1 deletion(-)
 create mode 100644 packages/tooling/Lint/Monticello.st

diff --git a/packages/tooling/ChangeLog b/packages/tooling/ChangeLog
index 8c85f31..a1a8760 100644
--- a/packages/tooling/ChangeLog
+++ b/packages/tooling/ChangeLog
@@ -1,5 +1,15 @@
 2013-03-30  Holger Hans Peter Freyther  <address@hidden>
 
+       * Lint/Monticello.st: Added Monticello class for linting.
+       * Parser/EmittedClass.st: Reimplement >>#isEmittedClass, 
>>#methodsToEmit,
+               >>#classMethodsToEmit, #>>isComplete.
+       * Parser/EmittedEntity.st: Added >>#isEmittedClass.
+       * Parser/Loader.st: Add >>#stuffToEmit selector.
+       * TODO: Add work item.
+       * package.xml: Add the Lint/Monticello.st.
+
+2013-03-30  Holger Hans Peter Freyther  <address@hidden>
+
        * Makefile.frag: Added.
        * Parser/EmittedClass.st: Added from scripts/Convert.st.
        * Parser/EmittedComments.st: Added from scripts/Convert.st.
diff --git a/packages/tooling/Lint/Monticello.st 
b/packages/tooling/Lint/Monticello.st
new file mode 100644
index 0000000..3c7a45c
--- /dev/null
+++ b/packages/tooling/Lint/Monticello.st
@@ -0,0 +1,151 @@
+"======================================================================
+|
+|   Linting for Monticello export
+|
+|
+ ======================================================================"
+
+"======================================================================
+|
+| Copyright 2013 Free Software Foundation, Inc.
+| Written by Holger Hans Peter Freyther.
+|
+| This file is part of the GNU Smalltalk class library.
+|
+| The GNU Smalltalk class library is free software; you can redistribute it
+| and/or modify it under the terms of the GNU Lesser General Public License
+| as published by the Free Software Foundation; either version 2.1, or (at
+| your option) any later version.
+|
+| The GNU Smalltalk class library is distributed in the hope that it will be
+| useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
+| General Public License for more details.
+|
+| You should have received a copy of the GNU Lesser General Public License
+| along with the GNU Smalltalk class library; see the file COPYING.LIB.
+| If not, write to the Free Software Foundation, 59 Temple Place - Suite
+| 330, Boston, MA 02110-1301, USA.
+|
+ ======================================================================"
+
+
+Tooling.EmittedClass extend [
+    isComplete [
+        <category: 'accessing'>
+        ^ isComplete
+    ]
+
+    methodsToEmit [
+        <category: 'accessing'>
+        ^ methodsToEmit
+    ]
+
+    classMethodsToEmit [
+        <category: 'accessing'>
+        ^ classMethodsToEmit
+    ]
+
+    isComplete [
+        <category: 'accessing'>
+        ^ isComplete
+    ]
+]
+
+Object subclass: Monticello [
+    | loader package errors |
+    <category: 'Tooling-Lint-Monticello'>
+
+    Monticello class >> lint: aPackage [
+        "Work on a given package."
+        ^ self new
+            loadPackage: aPackage;
+            lint.
+    ]
+
+    loadPackage: aPackage [
+        package := aPackage.
+        loader := Tooling.Loader new.
+
+        self lintFiles: aPackage fileIns.
+        aPackage test ifNotNil: [
+            self lintFiles: aPackage test fileIns].
+    ]
+
+    lintFiles: aList [
+        | files |
+
+        files := package fullPathsOf: aList.
+        files do: [:each | | file |
+            file := each open: FileStream read.
+            loader parseSmalltalkStream: file with: STInST.GSTFileInParser.
+            file close.
+        ]
+    ]
+
+    loader [
+        <category: 'private'>
+        ^ loader
+    ]
+
+    lint [
+        <category: 'lint'>
+        "TODO: this should use the visitor..."
+        loader stuffToEmit do: [:each |
+            each isEmittedClass ifTrue: [self lintClass: each]].
+    ]
+
+    lintClass: aClass [
+        <category: 'lint'>
+        aClass isComplete
+            ifTrue: [self lintCompleteClass: aClass]
+            ifFalse: [self lintExtension: aClass].
+    ]
+
+    lintCompleteClass: aClass [
+        <category: 'lint'>
+        "Check if the package name is in the category"
+        (aClass forClass category startsWith: package name)
+            ifFalse: [self addError: 'Class does not begin with package name'
+                                for: aClass forClass].
+    ]
+
+    lintExtension: aClass [
+        <category: 'lint'>
+
+        aClass methodsToEmit do: [:each |
+            self lintExtensionMethod: each on: aClass].
+        aClass classMethodsToEmit do: [:each |
+            self lintExtensionMethod: each on: aClass ].
+    ]
+
+    lintExtensionMethod: aSymbol on: aClass [
+        | method |
+        <category: 'lint'>
+        method := aClass forClass >> aSymbol.
+        (method methodCategory startsWith: ('*', package name))
+            ifFalse: [self addError: 'Method does not beging with 
*package-name'
+                                for: aClass forClass method: aSymbol].
+    ]
+
+    addError: aString for: aClass method: aMethod [
+        <category: 'error-handling'>
+        self errors add: '%1 on %2>>%3' % {aString. aClass name asString. 
aMethod}.
+    ]
+
+    addError: aString for: aClass [
+        <category: 'error-handling'>
+        self errors add: '%1 on %2' % {aString. aClass name asString}.
+    ]
+
+    errors [
+        <category: 'error-handling'>
+        ^ errors ifNil: [errors := OrderedCollection new].
+    ]
+
+    printErrors [
+        <category: 'error-handling'>
+        self errors do: [:each |
+            Transcript nextPutAll: each; nl.]
+    ]
+]
diff --git a/packages/tooling/Makefile.frag b/packages/tooling/Makefile.frag
index 01d8d86..0083a52 100644
--- a/packages/tooling/Makefile.frag
+++ b/packages/tooling/Makefile.frag
@@ -1,5 +1,5 @@
 Tooling_FILES = \
-packages/tooling/Parser/EmittedEntity.st 
packages/tooling/Parser/EmittedClass.st 
packages/tooling/Parser/EmittedComments.st 
packages/tooling/Parser/EmittedEval.st packages/tooling/Parser/Loader.st 
packages/tooling/Lint/Monticello.st
+packages/tooling/Parser/EmittedEntity.st 
packages/tooling/Parser/EmittedClass.st 
packages/tooling/Parser/EmittedComments.st 
packages/tooling/Parser/EmittedEval.st packages/tooling/Parser/Loader.st 
packages/tooling/Lint/Monticello.st 
 $(Tooling_FILES):
 $(srcdir)/packages/tooling/stamp-classes: $(Tooling_FILES)
        touch $(srcdir)/packages/tooling/stamp-classes
diff --git a/packages/tooling/Parser/EmittedClass.st 
b/packages/tooling/Parser/EmittedClass.st
index 9a2cb13..0db74eb 100644
--- a/packages/tooling/Parser/EmittedClass.st
+++ b/packages/tooling/Parser/EmittedClass.st
@@ -82,4 +82,24 @@ EmittedEntity subclass: EmittedClass [
             completeFileOut: isComplete;
             fileOutSelectors: methodsToEmit classSelectors: classMethodsToEmit.
     ]
+
+    isEmittedClass [
+        <category: 'accessing'>
+        ^ true
+    ]
+
+    methodsToEmit [
+        <category: 'accessing'>
+        ^ methodsToEmit
+    ]
+
+    classMethodsToEmit [
+        <category: 'accessing'>
+        ^ classMethodsToEmit
+    ]
+
+    isComplete [
+        <category: 'accessing'>
+        ^ isComplete
+    ]
 ]
diff --git a/packages/tooling/Parser/EmittedEntity.st 
b/packages/tooling/Parser/EmittedEntity.st
index aeb6928..9bdcf73 100644
--- a/packages/tooling/Parser/EmittedEntity.st
+++ b/packages/tooling/Parser/EmittedEntity.st
@@ -36,4 +36,8 @@ Object subclass: EmittedEntity [
     emitTo: aStream filteredBy: aBlock [
         self subclassResponsibility
     ]
+
+    isEmittedClass [
+        ^ false
+    ]
 ]
diff --git a/packages/tooling/Parser/Loader.st 
b/packages/tooling/Parser/Loader.st
index 6b64301..c8fb0ec 100644
--- a/packages/tooling/Parser/Loader.st
+++ b/packages/tooling/Parser/Loader.st
@@ -232,4 +232,9 @@ STInST.STClassLoader subclass: Loader [
                 ifTrue: [ stuffToEmit last addMethod: aMethod ]
                 ifFalse: [ stuffToEmit add: ((EmittedClass forExtension: 
currentClass) addMethod: aMethod) ]
     ]
+
+    stuffToEmit [
+        <category: 'accessing'>
+        ^ stuffToEmit
+    ]
 ]
diff --git a/packages/tooling/TODO b/packages/tooling/TODO
index bc29fe6..193c08a 100644
--- a/packages/tooling/TODO
+++ b/packages/tooling/TODO
@@ -1,2 +1,13 @@
 * Make the Loader have a Converter subclass and use a Visitor instead
   of the calls to emitTo:.
+
+* The following is shown as a a single class
+  Object subclass: Foo [
+        signal []
+  ]
+
+  Foo extend [
+        signalTwo []
+  ]
+
+  It should be two EmittedClass
diff --git a/packages/tooling/package.xml b/packages/tooling/package.xml
index ff3c23f..2bda19d 100644
--- a/packages/tooling/package.xml
+++ b/packages/tooling/package.xml
@@ -8,4 +8,6 @@
     <filein>Parser/EmittedComments.st</filein>
     <filein>Parser/EmittedEval.st</filein>
     <filein>Parser/Loader.st</filein>
+
+    <filein>Lint/Monticello.st</filein>
 </package>
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]