MCPcopy Index your code
hub / github.com/INRIA/spoon

github.com/INRIA/spoon @v11.4.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v11.4.0 ↗ · + Follow
19,516 symbols 104,807 edges 2,483 files 4,325 documented · 22%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Maven Central GHA tests Workflow Status Coverage Status Maintainability Rating Reproducible Builds

Spoon

Spoon is an open-source library to analyze, rewrite, transform, transpile Java source code. It parses source files to build a well-designed AST with powerful analysis and transformation API. It supports modern Java versions up to Java 25. Spoon is an official Inria open-source project, and member of the OW2 open-source consortium.

Documentation

The latest official documentation is available at https://spoon.gforge.inria.fr/.

Academic usage

If you use Spoon for academic purposes, please cite: Renaud Pawlak, Martin Monperrus, Nicolas Petitprez, Carlos Noguera, Lionel Seinturier. “Spoon: A Library for Implementing Analyses and Transformations of Java Source Code”. In Software: Practice and Experience, Wiley-Blackwell, 2015. Doi: 10.1002/spe.2346.

@article{pawlak:hal-01169705,
  TITLE = "{Spoon: A Library for Implementing Analyses and Transformations of Java Source Code}",
  AUTHOR = {Pawlak, Renaud and Monperrus, Martin and Petitprez, Nicolas and Noguera, Carlos and Seinturier, Lionel},
  JOURNAL = "{Software: Practice and Experience}",
  PUBLISHER = "{Wiley-Blackwell}",
  PAGES = {1155-1179},
  VOLUME = {46},
  URL = {https://hal.archives-ouvertes.fr/hal-01078532/document},
  YEAR = {2015},
  doi = {10.1002/spe.2346},
}

Professional support

If you need professional support on Spoon (development, training, extension), you are welcome to post a comment on https://github.com/INRIA/spoon/issues/3251

Getting started in 2 seconds

Required Java version:

  • Spoon 11.x requires JDK 17 or later.
  • Spoon 10.x requires JDK 11 or later.
  • Spoon 9.x requires Java 8.

Note that Spoon can of course still consume source code for older versions of Java, but it needs the above mentioned JDK version to run.

Get latest stable version with Maven, see https://search.maven.org/artifact/fr.inria.gforge.spoon/spoon-core

And start using it:

CtClass l = Launcher.parseClass("class A { void m() { System.out.println(\"yeah\");} }");

Documentation:

Contributing in 2 seconds

Create your first pull request to improve the documentation, see doc! Proceed with your first bug fix! The community is open-minded, respectful and patient. All external contributions are welcome.

Design Philosophy

R1) The Spoon metamodel is as close as possible to the language concepts.

R2) The Spoon model of a program is complete and sound.

R3) The text version of a Spoon model is well-formed and semantically equivalent to the original program.

R4) The analysis and transformation API is intuitive and regular.

R5) Transformation operators are designed to warn as fast as possible about invalid programs. This is done either with static type checking or with dynamic checks when the operators are used.

R6) When feasible, the text version of a Spoon model is close to the original one.

Compiling

To compile Spoon, you need a Java Development Kit (JDK) and Maven:

git clone https://github.com/INRIA/spoon
cd spoon
mvn compile

To run the tests:

mvn test

Releases

See Releases

License

Spoon is Free and Open Source, double-licensed under the (CeCILL-C license - French equivalent to LGPL) and the MIT license.

JProfiler

Spoon is developed with the help of JProfiler, a Java profiler by ej-technologies GmbH. JProfiler supports the development of Spoon by providing its full-featured Java Profiler for free. We thank ej-technologies GmbH for this support.

JProfiler

Powered by

JetBrains logo.

Github Contributors

This list is generated by chore/generate-contributor-list.py. If you're not listed or you'd like to have your full name, please post to https://github.com/INRIA/spoon/issues/3909.

  • adamjryan
  • Alcides Fonseca
  • Alexander Shopov
  • Aman Sharma
  • andrewbwogi
  • André Cruz
  • André Silva
  • Antoine Mottier
  • Anton Lyxell
  • argius
  • Arnaud Blouin
  • arsenkhy
  • Artamm
  • Artur Bosch
  • Arvid Siberov
  • aryan
  • Ashutosh Kumar Verma
  • aveuiller
  • Axel Howind
  • Benjamin DANGLOT
  • Benoit Cornu
  • Carlos Noguera
  • Ceki Gülcü
  • chammp
  • Charm
  • ChrisSquare
  • Christophe Dufour
  • Christopher Stokes
  • Clemens Bartz
  • Clément Fournier
  • César Soto Valero
  • Daniel Bobbert
  • Darius Sas
  • David Bernard
  • Didier Donsez
  • Diorcet Yann
  • Dorota Kopczyk
  • dufaux
  • dwayneb
  • dya-tel
  • Eddie T
  • Egor Bredikhin
  • Fabien DUMINY
  • Fan Long
  • fangzhen
  • fav
  • Favio DeMarco
  • Fernanda Madeiral
  • Filip Krakowski
  • Gabriel Chaperon Burgos
  • gibahjoe
  • GitHub Actions Bot
  • GluckZhang
  • Gregor Zeitlinger
  • gtoison
  • Guillaume Toison
  • Gérard Paligot
  • Hannes Greule
  • Haris Adzemovic
  • HectorSM
  • Henry Chu
  • Hervé Boutemy
  • Horia Constantin
  • I-Al-Istannen
  • intrigus-lgtm
  • jakobbraun
  • Jan Galinski
  • jon
  • Kai Luo
  • Lakshya A Agrawal
  • leventov
  • Lionel Seinturier
  • lodart
  • Lucas
  • Lukas Krejci
  • Luke Merrick
  • Marcel Manseer
  • Marcel Steinbeck
  • Martin Monperrus
  • Martin Wittlinger
  • MartinWitt
  • Matias Martinez
  • Maxim Stefanov
  • Maxime CLEMENT
  • Mehdi Kaytoue
  • Michael Täge
  • Mickael Istria
  • Miguel Sozinho Ramalho
  • Mikael Forsberg
  • Mr. Pine
  • Muhammet Ali AKBAY
  • Nicolas Harrand
  • Nicolas Pessemier
  • Nicolas Petitprez
  • Noah Santschi-Cooney
  • Olivier Barais
  • Ondřej Šebek
  • Patrick Schmitt
  • Pavel Vojtechovsky
  • peroksid90
  • Philippe Ombredanne
  • Phillip Schichtel
  • priyanka-28
  • Quentin LE DILAVREC
  • raymogg
  • Renaud Pawlak
  • Reza Gharibi
  • Rhys Compton
  • Rick Kellogg
  • Rijnard van Tonder
  • Rohitesh Kumar Jain
  • Roman Leventov
  • Ryota Hiyoshi
  • Sander Ploegsma
  • santos-samuel
  • scootafew
  • Scott Dickerson
  • Scott Pinwell
  • Sebastian Lamelas Marcote
  • Sergey Fedorov
  • Shantanu
  • Simon Larsén
  • Simon Urli
  • Spencer Williams
  • srlm
  • ST0NEWALL
  • Stefan Wolf
  • StepSecurity Bot
  • Sébastien Bertrand
  • The Spoon Bot
  • Thimo Seitz
  • Thomas Durieux
  • tiagodrcarvalho
  • Tomasz Zieliński
  • Urs Keller
  • Viktor
  • Vincenzo Musco
  • Wolfgang Schmiesing
  • Wouter Smeenk
  • Wreulicke
  • Yann Diorcet
  • Yogya Tulip Gamage
  • Zhang Xindong
  • Дмитрий

Extension points exported contracts — how you extend this code

JavadocElement (Interface)
A semantic part of a javadoc comment. [152 implementers]
spoon-javadoc/src/main/java/spoon/javadoc/api/elements/JavadocElement.java
IBar (Interface)
Created by thomas on 28/10/16. [81 implementers]
src/test/resources/compilation/compilation-tests/IBar.java
JavadocDescriptionElement (Interface)
An element of a description: either an inline tag or a piece of text. So for example a text or {@ [7 implementers]
src/main/java/spoon/javadoc/internal/JavadocDescriptionElement.java
Label (Interface)
A Label is a piece of arbitrary information associated with a state of a CTL model. [10 implementers]
spoon-smpl/src/main/java/spoon/smpl/Label.java
Decompiler (Interface)
(no doc) [6 implementers]
spoon-decompiler/src/main/java/spoon/decompiler/Decompiler.java
ExceptionControlFlowStrategy (Interface)
Base interface for exception control flow strategies. [2 implementers]
spoon-control-flow/src/main/java/fr/inria/controlflow/ExceptionControlFlowStrategy.java
Checker (Interface)
(no doc) [4 implementers]
spoon-dataflow/src/main/java/fr/inria/spoon/dataflow/checkers/Checker.java
JavadocVisitor (Interface)
A visitor for javadoc elements. @param the return type of the visit methods [2 implementers]
spoon-javadoc/src/main/java/spoon/javadoc/api/elements/JavadocVisitor.java

Core symbols most depended-on inside this repo

get
called by 5155
src/main/java/spoon/processing/ProcessorProperties.java
assertEquals
called by 4226
src/main/java/spoon/ContractVerifier.java
toString
called by 1504
src/main/java/spoon/reflect/declaration/CtElement.java
assertTrue
called by 1448
src/main/java/spoon/ContractVerifier.java
equals
called by 1152
src/test/java/spoon/test/lambda/testclasses/Foo.java
Type
called by 898
src/main/java/spoon/reflect/factory/Factory.java
getSimpleName
called by 849
src/test/java/spoon/testing/assertions/CtTypeAssertInterface.java
field
called by 836
src/test/java/spoon/test/api/Metamodel.java

Shape

Method 16,044
Class 2,684
Interface 515
Function 158
Enum 115

Languages

Java99%
TypeScript1%
Python1%

Modules by API surface

src/main/java/spoon/reflect/meta/impl/ModelRoleHandlers.java592 symbols
src/main/java/spoon/support/visitor/replace/ReplacementVisitor.java412 symbols
src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java156 symbols
src/main/java/spoon/reflect/factory/FactoryImpl.java143 symbols
src/test/resources/noclasspath/Solver.java142 symbols
src/main/java/spoon/reflect/factory/Factory.java139 symbols
src/main/java/spoon/reflect/visitor/CtInheritanceScanner.java132 symbols
src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java107 symbols
src/main/java/spoon/support/DefaultCoreFactory.java106 symbols
src/main/java/spoon/reflect/factory/CoreFactory.java105 symbols
spoon-control-flow/src/main/java/fr/inria/controlflow/ControlFlowBuilder.java99 symbols
src/main/java/spoon/reflect/visitor/CtScanner.java98 symbols

Datastores touched

(mysql)Database · 1 repos
myDbDatabase · 1 repos

For agents

$ claude mcp add spoon \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact