What Java packages are impacted by a proposed change? Do all your enterprise beans comply with the EJB design rules? Are all team members following your in-house coding conventions? What packages and types need refactoring?
Find the answers with SemmleCode
. Free to download and free to use, SemmleCode
is a new Eclipse plugin for drilling down into your codebase. It exposes the relationships between different elements in your code, so that you can search and measure them. SemmleCode
takes code queries in development environments to a whole new level.
is shipped with a large collection of queries for common tasks, including popular metrics and many checks for bugs and for style violations. Query results can be visualised in a tree view, in the Eclipse problem view, or as charts or graphs, all with direct links to the source code.
What it does
To understand large software projects, you need to drill down into the relationships between its components. SemmleCode
opens up these relationships for you to inspect and query.
works by storing Eclipse projects in a relational database. You can then run queries to compute metrics, to find defects, to check style rules, and to navigate. For almost any frequent task, whether it involves a quality audit or a change impact analysis, there is a ready-made query that you can launch via the run
menu of Eclipse. In particular there are queries for Robert C. Martin's package metrics, and for checking J2EE coding conventions.
Storing a relational representation of code is not new; many tools marketed under the banners of application portfolio management
, application mining
, application intelligence
, business intelligence for software development
, and source code analysis
do the same. What sets SemmleCode
apart is the ease of adapting queries to new situations, and the power of its .QL
query language. SemmleCode
offers many of the benefits of these other tools, but in an agile way, putting the information at the fingertips of every team member, easily adapted to their expertise and needs.
.QL for Checking
.QL is a simple object-oriented query language
for writing queries over the codebase. It is very intuitive, and tightly integrated in Eclipse with syntax highlighting, auto-completion, and continuous checking.
As a first example, let's write a query that is one of the rules for EJBs: every method in a local home interface must not include RemoteException
in its throws
clause. With .QL
we can find violations as follows:
LocalEJBHomeInterface lhi, Method m
m, m.toString() + " must not throw an exception of
This query will generate warnings in the Eclipse problem view, as well as warning markers in the source code itself. Of course many frameworks have similar restrictions on API usage, and now you can pin those down with code queries in .QL
.QL for Measuring
Metrics can also be defined via .QL
queries. To illustrate, the afferent coupling
of a type is the number of other types that depend on it. Types with high afferent coupling have many responsibilities, and changing them may have a very broad impact on a system. To find such types, you can use the query
RefType t, int
c = count
(RefType s | depends(s,t)) and
c > 25
t,c order by
The predicate depends(s,t)
tests whether type s
depends on type t
. Very roughly, that means t
is used somewhere within s
. The results of the above query can be displayed as a bar chart; clicking on a bar takes you to the corresponding type definition.
helps you to give crisp, simple definitions of all the popular metrics. The SemmleCode
documentation includes a full overview of the metrics library
. Each metric has a page for entering comments - at Semmle, we love to see vigorous debate about the subtle points of every metric, and about the technical details of their definition in .QL
. Do join us there!
Re-using .QL queries
allows you to encapsulate common queries as methods in class definitions, which makes it easy to share libraries of queries with your friends and colleagues. To illustrate, let's define a subclass of RefType
, with a new method for counting the number of fields:
(Field m | m.getDeclaringType() = this
In words, a method is defined by a relation between two special variables, this
. Above, the result
is just the number of methods that are declared in this
type. The new class and method can then be immediately used in a select statement:
MetricType t, int
n = t.numberOfFields() and
n > 20
supports overriding of methods, and that is often very convenient for tailoring checks or metrics to a particular application. SemmleCode
puts you in the driving seat when it comes to quality audits: when you think of a new check, it usually takes only a few lines of .QL
to implement it, and share it with other team members.
To find out more about writing queries and displaying results, read the introductory tutorial
. To see how you can define your own classes, and how overriding works in .QL
, read the advanced tutorial
. There is a community page
with forums, FAQs, a bugzilla, and links to further documentation. The development of SemmleCode
is driven by the user community, so do let us know what you think!
About the creators of SemmleCode
develops novel query technologies. Its first line of products is centred around .QL - an object-oriented query language
for any type of structured data. It makes writing queries much easier and more efficient than with the de facto
industry standard SQL. Because .QL
is object-oriented, queries can be easily re-used or adapted to new situations.
Our technology can be employed on all of the major relational database systems. .QL
queries are translated (through Semmle's proprietary technology) to highly optimised SQL queries on these existing systems. You can therefore enjoy the benefits of .QL without
migrating data to a new repository, and there is no risk of disruption when .QL
is introduced in your organisation.
As a demonstration of the power of .QL
, Semmle distributes SemmleCode
for free. Enjoy!